
    "d                        d dl mZ d dlZd dlmZmZmZmZ d dlm	Z	m
Z
 d dlmZ d dlmZ  ej                  e      Z G d de      Zy)	    )annotationsN)TYPE_CHECKINGListTupleUnion)InotifyInotifyEvent)
BaseThread)DelayedQueuec                  F     e Zd ZdZdZd	 fd	Zd Zd Zd Zd Z	d Z
 xZS )
InotifyBufferzA wrapper for `Inotify` that holds events for `delay` seconds. During
    this time, IN_MOVED_FROM and IN_MOVED_TO events are paired.
    g      ?c                    t         |           t        t           | j                        | _        t        ||      | _        | j                          y N)	super__init__r   r	   delay_queuer   _inotifystart)selfpath	recursive	__class__s      C/usr/lib/python3/dist-packages/watchdog/observers/inotify_buffer.pyr   zInotifyBuffer.__init__"   s:    "<0<i0

    c                6    | j                   j                         S )zReturns a single event or a tuple of from/to events in case of a
        paired move event. If this buffer has been closed, immediately return
        None.
        )r   getr   s    r   
read_eventzInotifyBuffer.read_event(   s    
 {{  r   c                l    | j                   j                          | j                  j                          y r   )r   closer   r   s    r   on_thread_stopzInotifyBuffer.on_thread_stop/   s"    r   c                D    | j                          | j                          y r   )stopjoinr   s    r   r!   zInotifyBuffer.close3   s    				r   c                   g }|D ]  t         j                  d       fd}j                  rt        |      D ].  \  }} ||      st        rt        |t              rJ |f||<    e | j                  j                  |      }||j                  |f       t         j                  d       |j                         |j                          |S )zGroup any matching move eventszin-event %sc                x    t        | t               xr' | j                  xr | j                  j                  k(  S r   )
isinstancetupleis_moved_fromcookie)eventinotify_events    r   matching_from_eventz8InotifyBuffer._group_events.<locals>.matching_from_event=   s:    "5%00 =++=(<(<<r   z'could not find matching move_from event)
loggerdebugis_moved_to	enumerater   r(   r)   r   removeappend)r   
event_listgroupedr.   indexr,   
from_eventr-   s          @r   _group_eventszInotifyBuffer._group_events7   s    PR' 	.MLL6 (($-g$6 6LE5*51('1%'??#?*/)?6 "&!3!34G!HJ!-
M'BC%NO}5}-9	.: r   c                D   d}| j                         r|s	| j                  j                         }| j                  |      }|D ]  }t	        |t
              s2|j                  r&|j                  | j                  j                  k(  rd}Et	        |t
               xr |j                  }| j                  j                  ||       t	        |t
              r|j                  s|j                  | j                  j                  k(  sd} | j                         r|syyyy)zRead event from `inotify` and add them to `queue`. When reading a
        IN_MOVE_TO event, remove the previous added matching IN_MOVE_FROM event
        and add them back to the queue as a tuple.
        FTN)should_keep_runningr   read_eventsr9   r(   r)   
is_ignoredsrc_pathr   r*   r   putis_delete_self)r   deleted_selfinotify_eventsgrouped_eventsr-   r   s         r   runzInotifyBuffer.runY   s    
 &&(!]]668N!//?N!/ (!-7M<T<T$--1C1CC (, #=%88X]=X=X  u5 #=%8%44%..$--2D2DD $(L)( &&(((r   )F)__name__
__module____qualname____doc__r   r   r   r"   r!   r9   rD   __classcell__)r   s   @r   r   r      s.     E! D(r   r   )
__future__r   loggingtypingr   r   r   r   watchdog.observers.inotify_cr   r	   watchdog.utilsr
   watchdog.utils.delayed_queuer   	getLoggerrE   r/   r    r   r   <module>rR      s<    #  4 4 > % 5			8	$[(J [(r   