o
    *ήco#                     @   s4  d 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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Zddl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#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z. e/e0Z1G dd	 d	eZ2G d
d dZ3G dd deZ4G dd deZ5dS )zk
:module: watchdog.observers.fsevents2
:synopsis: FSEvents based emitter implementation.
:platforms: macOS
    N)Thread)FileDeletedEventFileModifiedEventFileCreatedEventFileMovedEventDirDeletedEventDirModifiedEventDirCreatedEventDirMovedEvent)BaseObserverEventEmitterDEFAULT_EMITTER_TIMEOUTDEFAULT_OBSERVER_TIMEOUT)	FSEventStreamCreateCFRunLoopGetCurrent FSEventStreamScheduleWithRunLoopFSEventStreamStartCFRunLoopRunCFRunLoopStopFSEventStreamStopFSEventStreamInvalidateFSEventStreamRelease)kCFAllocatorDefaultkCFRunLoopDefaultModekFSEventStreamEventIdSinceNowkFSEventStreamCreateFlagNoDefer"kFSEventStreamCreateFlagFileEvents"kFSEventStreamEventFlagItemCreated"kFSEventStreamEventFlagItemRemoved'kFSEventStreamEventFlagItemInodeMetaMod"kFSEventStreamEventFlagItemRenamed#kFSEventStreamEventFlagItemModified(kFSEventStreamEventFlagItemFinderInfoMod&kFSEventStreamEventFlagItemChangeOwner#kFSEventStreamEventFlagItemXattrMod kFSEventStreamEventFlagItemIsDir$kFSEventStreamEventFlagItemIsSymlinkc                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )FSEventsQueuez Low level FSEvents client. c              	   C   sz   t |  t | _d | _t|trt	|}t
d|| _d }d}tt| j|| jgt|ttB | _| jd u r;tdd S )NNFCg      ?z"FSEvents. Could not create stream.)r   __init__queueQueue_queue	_run_loop
isinstancebytesosfsdecodeunicodedata	normalize_pathr   r   	_callbackr   r   r   _stream_refOSError)selfpathcontextlatency r<   C/tmp/pip-target-vg8gfxp4/lib/python/watchdog/observers/fsevents2.pyr)   T   s    




zFSEventsQueue.__init__c                 C   s   t j  }t | _t| j| jt t	| js&t
| j t| j tdt  t| j t
| j t| j ~| jd  d S )Nz!FSEvents. Could not start stream.)AppKitNSAutoreleasePoolallocinitr   r-   r   r6   r   r   r   r   r7   r   r   r,   put)r8   poolr<   r<   r=   runf   s   






zFSEventsQueue.runc                 C   s   | j d urt| j  d S d S N)r-   r   r8   r<   r<   r=   stopx   s   
zFSEventsQueue.stopc           	      C   sH   dd t |||D }td|  |D ]}t| q| j| d S )Nc                 S   s   g | ]\}}}t |||qS r<   )NativeEvent).0r9   flags_idr<   r<   r=   
<listcomp>}   s    z+FSEventsQueue._callback.<locals>.<listcomp>z!FSEvents callback. Got %d events:)ziploggerdebugr,   rB   )	r8   	streamRefclientCallBackInfo	numEvents
eventPaths
eventFlagseventIDseventser<   r<   r=   r5   |   s   
zFSEventsQueue._callbackc                 C   s   |   sdS | j S )zo
        Returns a list or one or more events, or None if there are no more
        events to be read.
        N)is_aliver,   getrF   r<   r<   r=   read_events   s   
zFSEventsQueue.read_eventsN)	__name__
__module____qualname____doc__r)   rD   rG   r5   rZ   r<   r<   r<   r=   r'   Q   s    r'   c                   @   s(   e Zd Zdd Zedd Zdd ZdS )rH   c                 C   s   || _ || _|| _t|t@ | _t|t@ | _t|t@ | _	t|t
@ | _t|t@ | _t|t@ | _t|t@ | _t|t@ | _t|t@ | _t|t@ | _d S rE   )r9   rJ   event_idboolr   
is_createdr   
is_removedr    
is_renamedr!   is_modifiedr#   is_change_ownerr   is_inode_meta_modr"   is_finder_info_modr$   is_xattr_modr&   
is_symlinkr%   is_directory)r8   r9   rJ   r_   r<   r<   r=   r)      s   zNativeEvent.__init__c                 C   s@   | j rdS | jr
dS | jrdS | jrdS | jrdS | jrdS dS )NCreatedRemovedRenamedModifiedInodeMetaModXattrModUnknown)ra   rb   rc   rd   rf   rh   rF   r<   r<   r=   _event_type   s   zNativeEvent._event_typec                 C   s0   d}|t | jt| j| j| jt| j| jf S )Nz2<%s: path=%s, type=%s, is_dir=%s, flags=%s, id=%s>)	typer[   reprr9   rr   rj   hexrJ   r_   )r8   sr<   r<   r=   __repr__   s   zNativeEvent.__repr__N)r[   r\   r]   r)   propertyrr   rw   r<   r<   r<   r=   rH      s
    
rH   c                       s4   e Zd ZdZef fdd	Zdd Zdd Z  ZS )FSEventsEmitterzL
    FSEvents based event emitter. Handles conversion of native events.
    c                    s*   t  ||| t|j| _| j  d S rE   )superr)   r'   r9   	_fseventsstart)r8   event_queuewatchtimeout	__class__r<   r=   r)      s   zFSEventsEmitter.__init__c                 C   s   | j   d S rE   )r{   rG   rF   r<   r<   r=   on_thread_stop   s   zFSEventsEmitter.on_thread_stopc                 C   s   | j  }|d u rd S d}|t|k r|| }|jr|d t|k rl||d  jrl||d  j|jd krl|jr;tnt}| ||j	||d  j	 | t
tj	|j	 | t
tj	||d  j	 |d7 }ntj	|j	r|jrxtnt}| ||j	 | t
tj	|j	 ns|jrtnt}| ||j	 | t
tj	|j	 nW|js|js|jr|jrt
nt}| ||j	 n>|jr|jrtnt}| ||j	 | t
tj	|j	 n|jr|jrtnt}| ||j	 | t
tj	|j	 |d7 }|t|k sd S d S )Nr      )r{   rZ   lenrc   r_   rj   r
   r   queue_eventr9   r   r0   dirnameexistsr	   r   r   r   rd   rf   rh   r   ra   rb   )r8   r   rV   ieventclsr<   r<   r=   queue_events   sF   
 
zFSEventsEmitter.queue_events)	r[   r\   r]   r^   r   r)   r   r   __classcell__r<   r<   r   r=   ry      s
    ry   c                       s    e Zd Zef fdd	Z  ZS )FSEventsObserver2c                    s   t  jt|d d S )N)emitter_classr   )rz   r)   ry   )r8   r   r   r<   r=   r)      s   zFSEventsObserver2.__init__)r[   r\   r]   r   r)   r   r<   r<   r   r=   r      s    r   )6r^   r0   loggingr*   r2   	threadingr   watchdog.eventsr   r   r   r   r   r   r	   r
   watchdog.observers.apir   r   r   r   r>   FSEventsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   	getLoggerr[   rN   r'   rH   ry   r   r<   r<   r<   r=   <module>   s    (
,D
=&@