
    g7                       d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
ZddlmZmZmZmZmZmZmZmZmZmZ ddlmZmZmZmZ ddlmZ e	rddlmZmZ dd	lm Z m!Z!  ejD                  d
      Z# G d de      Z$ G d de      Z%y)u   :module: watchdog.observers.fsevents
:synopsis: FSEvents based emitter implementation.
:author: yesudeep@google.com (Yesudeep Mangalapilly)
:author: contact@tiger-222.fr (Mickaël Schoentgen)
:platforms: macOS
    )annotationsN)TYPE_CHECKING)
DirCreatedEventDirDeletedEventDirModifiedEventDirMovedEventFileCreatedEventFileDeletedEventFileModifiedEventFileMovedEventgenerate_sub_created_eventsgenerate_sub_moved_events)DEFAULT_EMITTER_TIMEOUTDEFAULT_OBSERVER_TIMEOUTBaseObserverEventEmitter)DirectorySnapshot)FileSystemEventFileSystemEventHandler)
EventQueueObservedWatchfseventsc                       e Zd ZdZeddd	 	 	 	 	 	 	 	 	 	 	 d fdZddZddZddZdd	Z	dd
Z
ddZ	 	 	 	 	 	 	 	 	 	 	 	 ddZddZedd       ZddZddZddZddZddZ xZS )FSEventsEmittera  macOS FSEvents Emitter class.

    :param event_queue:
        The event queue to fill with events.
    :param watch:
        A watch object representing the directory to monitor.
    :type watch:
        :class:`watchdog.observers.api.ObservedWatch`
    :param timeout:
        Read events blocking timeout (in seconds).
    :param event_filter:
        Collection of event types to emit, or None for no filtering (default).
    :param suppress_history:
        The FSEvents API may emit historic events up to 30 sec before the watch was
        started. When ``suppress_history`` is ``True``, those events will be suppressed
        by creating a directory snapshot of the watched path before starting the stream
        as a reference to suppress old events. Warning: This may result in significant
        memory usage in case of a large number of items in the watched path.
    :type timeout:
        ``float``
    NF)timeoutevent_filtersuppress_historyc                  t         |   ||||       t               | _        || _        d| _        d | _        t        j                         | _	        t        j                  j                  t        j                  j                  t        j                  j                  | j                  j                                    | _        y )N)r   r   g        )super__init__set_fs_viewr   _start_time_starting_state	threadingLock_lockospathrealpathabspath
expanduserwatch_absolute_watch_path)selfevent_queuer-   r   r   r   	__class__s         P/var/www/openai/venv/lib/python3.12/site-packages/watchdog/observers/fsevents.pyr    zFSEventsEmitter.__init__A   s     	eW<X"%% 09=^^%
$&GG$4$4RWW__RWWEWEWX\XbXbXgXgEh5i$j!    c                l    t        j                  | j                         t        j                  |        y N)	_fseventsremove_watchr-   stopr/   s    r2   on_thread_stopzFSEventsEmitter.on_thread_stopR   s     tzz*tr3   c                    | j                   j                  s| j                  |      s-t        j	                  d|       t        j                  | |       y t        j	                  d|       y )Nzqueue_event %szdrop event %s)_watchis_recursive_is_recursive_eventloggerdebugr   queue_event)r/   events     r2   rA   zFSEventsEmitter.queue_eventV   sK     ;;##4+C+CE+JLL)51$$T51LL%0r3   c                D   |j                   r|j                  n(t        j                  j	                  |j                        }|| j
                  k(  ryt        |t        t        f      r9t        j                  j	                  |j                        }|| j
                  k(  ryy)NFT)
is_directorysrc_pathr(   r)   dirnamer.   
isinstancer   r   	dest_path)r/   rB   rE   rH   s       r2   r>   z#FSEventsEmitter._is_recursive_event_   sr    %*%7%75>>RWW__U^^=\t000enm<= 8ID555r3   c                    |j                   rt        nt        }| j                   ||             | j                  t	        |             y r5   )rD   r   r	   rA   r   r/   rB   rE   rF   clss        r2   _queue_created_eventz$FSEventsEmitter._queue_created_eventm   8    !&!3!3o9IX')'23r3   c                    |j                   rt        nt        }| j                   ||             | j                  t	        |             y r5   )rD   r   r
   rA   r   rJ   s        r2   _queue_deleted_eventz$FSEventsEmitter._queue_deleted_eventr   rM   r3   c                b    |j                   rt        nt        }| j                   ||             y r5   )rD   r   r   rA   rJ   s        r2   _queue_modified_eventz%FSEventsEmitter._queue_modified_eventw   s%    "'"4"4:KX'r3   c                    |j                   rt        nt        }| j                  |      }| j	                   |||             | j	                  t        |             | j	                  t        |             y r5   )rD   r   r   _encode_pathrA   r   )r/   	src_eventrE   dst_pathsrc_dirnamedst_dirnamerK   s          r2   _queue_renamed_eventz$FSEventsEmitter._queue_renamed_event{   s`      )55m>$$X.Xx01)+67)+67r3   c                    |j                   | j                  v }| j                  r9	 | j                  j                  |j                        d   }||j                   k(  }nd}|xs |S # t        $ r d}Y w xY w)Nr   F)inoder"   r$   r)   KeyError)r/   rB   
in_history	old_inodebefore_starts        r2   _is_historic_created_eventz*FSEventsEmitter._is_historic_created_event   sy     [[DMM1
% 0066uzzB1E	(EKK7 !L)\)  %$%s   7A& &A43A4c                R    | j                   xs | j                  xs | j                  S )z9Returns True if the event indicates a change in metadata.)is_inode_meta_modis_xattr_modis_owner_change)rB   s    r2   _is_meta_modzFSEventsEmitter._is_meta_mod   s&     &&U%*<*<U@U@UUr3   c                ^
   t         j                         t        j                  k  rA|D ]<  dj	                  fdt              D              }t         j                  d|       > t        j                         | j                  z
  dkD  rd | _
        |r|j                  d      | j                  j                        }t        j                  j                  |      }	 t        j                   |      }|xr |j$                  j&                  k(  }j(                  rj*                  r| j-                        s| j/                  ||       | j0                  j3                  j&                         j4                  s| j7                        r| j9                  ||       | j;                  ||       | j0                  j=                  j&                         nj(                  r$| j-                        s| j/                  ||       | j0                  j3                  j&                         j4                  s| j7                        r| j9                  ||       j>                  rtA        tC        fd|D              d       }|r2t         j                  d|       | j                  |j                        }	t        j                  j                  |	      }
| jE                  ||	||
       | j0                  j3                  j&                         tG        ||	      D ]  }| jI                  |        |jK                  |       |j4                  s| j7                  |      r| j9                  ||	|
       |j*                  r| j;                  ||	|
       | j0                  j=                  |j&                         n|rZ| j/                  ||       | j0                  j3                  j&                         tM        |      D ]  }| jI                  |        n:| j;                  ||       | j0                  j=                  j&                         ǉj*                  r8| j;                  ||       | j0                  j=                  j&                         jN                  rm| jI                  tQ        | jR                  j                               t         j                  d       | jU                          | j0                  jW                          |ry y # t"        $ r d }Y 4w xY w)	Nz, c              3  @   K   | ]  }t        |      d u s|  yw)TN)getattr).0attrrB   s     r2   	<genexpr>z/FSEventsEmitter.queue_events.<locals>.<genexpr>   s"     !^:4PTAUY]A]$:s   z%s: %s<   r   c              3  p   K   | ]-  }|j                   s|j                  j                  k(  s*| / y wr5   )
is_renamedrZ   )rh   erB   s     r2   rj   z/FSEventsEmitter.queue_events.<locals>.<genexpr>   s'     Z1!,,177ekkCYQs   666z"Destination event for rename is %sz&Stopping because root path was changed),r?   getEffectiveLevelloggingDEBUGjoindirr@   time	monotonicr#   r$   poprS   r)   r(   rF   statOSErrorst_inorZ   
is_created
is_removedr_   rL   r"   addis_modifiedrd   rQ   rO   discardrm   nextiterrX   r   rA   remover   is_root_changedr   r-   r8   clear)r/   r   eventsflagsrE   rV   rw   exists	dst_eventrU   rW   sub_moved_eventsub_created_eventrB   s                @r2   queue_eventszFSEventsEmitter.queue_events   s   ##%6		!^3u:!^^Xue4   >>d...3#'D JJqME((4H''//(3Kwwx( 8dkkU[[8F( E$4$4
 66u=--eX{K!!%++.$$(9(9%(@..uhL))%;G%%ekk2 ##D,K,KE,R--eX{K!!%++.$$(9(9%(@..uhL## $ZZZ!I
 !%I9U#'#4#4Y^^#D&(ggooh&?11%8[Zef))%++6/HS[/\O ,,_= 0]
 i0$00D4E4Ei4P 66y(KX$// 55i;W MM11)//B 11%;O))%++61LX1V- ,,->? 2W 11%;O--ekk: !##--eX{KMM))%++6$$   !ABEF		##%k   s   "T T,+T,c                V   t         j                  }	 t        ||||      D 	cg c]  \  }}}}	 |||||	       }
}}}}	| j                  5  | j	                  | j
                  |
       ddd       yc c}	}}}w # 1 sw Y   yxY w# t        $ r t        j                  d       Y yw xY w)zhCallback passed to FSEventStreamCreate(), it will receive all
        FS events and queue them.
        Nz(Unhandled exception in fsevents callback)	r6   NativeEventzipr'   r   r   	Exceptionr?   	exception)r/   pathsinodesr   idsrK   r)   rZ   event_flagsevent_idr   s              r2   events_callbackzFSEventsEmitter.events_callback   s     ##	I ;>eVUTW:X:X6D%h D%h7:X   !!$,,7 	  	IGH	Is?   B A3
B A;*B 3B ;B B B B('B(c                N   | j                   j                  g| _        t        j                         | _        	 t        j                  | | j                   | j                  | j                         t        j                  |        y # t        $ r t        j                  d       Y y w xY w)Nz&Unhandled exception in FSEventsEmitter)r-   r)   	pathnamesrt   ru   r#   r6   	add_watchr   read_eventsr   r?   r   r9   s    r2   runzFSEventsEmitter.run/  sy    **//*>>+	Gdjj$2F2FW!!$' 	GEF	Gs   AB B$#B$c                   | j                   rtt        | j                  j                  t              r)t        j                  | j                  j                        n| j                  j                  }t        |      | _        y y r5   )	r   rG   r-   r)   bytesr(   fsdecoder   r$   )r/   
watch_paths     r2   on_thread_startzFSEventsEmitter.on_thread_start8  sT      9CDJJOOUZ9[TZZ__5aeakakapapJ#4Z#@D  !r3   c                x    t        | j                  j                  t              rt	        j
                  |      S |S )z6Encode path only if bytes were passed to this emitter.)rG   r-   r)   r   r(   fsencode)r/   r)   s     r2   rS   zFSEventsEmitter._encode_path=  s'    $.tzz$Fr{{4 PDPr3   )r0   r   r-   r   r   floatr   "list[type[FileSystemEvent]] | Noner   boolreturnNone)r   r   )rB   r   r   r   )rB   r   r   r   )rB   r   rE   bytes | strrF   r   r   r   )rT   r   rE   r   rU   r   rV   r   rW   r   r   r   )rB   z_fsevents.NativeEventr   r   )r   r   r   zlist[_fsevents.NativeEvent]r   r   )
r   zlist[bytes]r   	list[int]r   r   r   r   r   r   )r)   r   r   r   )__name__
__module____qualname____doc__r   r    r:   rA   r>   rL   rO   rQ   rX   r_   staticmethodrd   r   r   r   r   rS   __classcell__r1   s   @r2   r   r   *   s    6 1;?!&kk k
 k 9k k 
k"14
4
(8"8 8 	8
 !8 !8 
8*" V V&BIGA
Qr3   r   c                  L     e Zd Zedd fdZddd	 	 	 	 	 	 	 	 	 d fdZ xZS )	FSEventsObserverr   c               0    t         |   t        |       y )Nr   )r   r    r   )r/   r   r1   s     r2   r    zFSEventsObserver.__init__C  s    ':r3   FN	recursiver   c               v    t        |t              rt        j                  d|      }t        |   ||||      S )NNFCr   )rG   strunicodedata	normalizer   schedule)r/   event_handlerr)   r   r   r1   s        r2   r   zFSEventsObserver.scheduleF  s;     dC ((5DwtyWcddr3   )r   r   r   r   )
r   r   r)   r   r   r   r   r   r   r   )r   r   r   r   r    r   r   r   s   @r2   r   r   B  sT    +C ;  ;?e-e e
 e 9e 
e er3   r   )&r   
__future__r   rp   r(   r%   rt   r   typingr   _watchdog_fseventsr6   watchdog.eventsr   r   r   r   r	   r
   r   r   r   r   watchdog.observers.apir   r   r   r   watchdog.utils.dirsnapshotr   r   r   r   r   	getLoggerr?   r   r    r3   r2   <module>r      s{    #  	      &   q p 8G@ 
		:	&UQl UQpe| er3   