U
    ꥡc#$                     @   sV  d 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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0e1Z2dZ3e4e3e5 e26e3 G d	d
 d
eZ7G dd dZ8G dd deZ9G dd deZ:d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$kFSEventStreamEventFlagItemIsSymlinkzSwatchdog.observers.fsevents2 is deprecated and will be removed in a future release.c                   @   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 krvt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contextZlatency r;   @/tmp/pip-unpacked-wheel-thtqfo2i/watchdog/observers/fsevents2.pyr)   Y   s&    



    
zFSEventsQueue.__init__c                 C   s   t j  }t | _t| j| jt t	| jsLt
| j t| j tdt  t| j t
| j t| j ~| jd  d S )Nz!FSEvents. Could not start stream.)AppKitZNSAutoreleasePoolZallocinitr   r-   r   r6   r   r   r   r   r7   r   r   r,   put)r8   poolr;   r;   r<   runk   s"      





zFSEventsQueue.runc                 C   s   | j d k	rt| j  d S N)r-   r   r8   r;   r;   r<   stop}   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   flagsZ_idr;   r;   r<   
<listcomp>   s     z+FSEventsQueue._callback.<locals>.<listcomp>z!FSEvents callback. Got %d events:)ziploggerdebugr,   r?   )	r8   Z	streamRefZclientCallBackInfoZ	numEventsZ
eventPathsZ
eventFlagsZ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,   getrC   r;   r;   r<   read_events   s    zFSEventsQueue.read_eventsN)	__name__
__module____qualname____doc__r)   rA   rD   r5   rP   r;   r;   r;   r<   r'   V   s   r'   c                   @   s(   e Zd Zdd Zedd Zdd ZdS )rE   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 rB   )r9   rG   event_idboolr   
is_createdr   
is_removedr    
is_renamedr!   is_modifiedr#   Zis_change_ownerr   is_inode_meta_modr"   Zis_finder_info_modr$   is_xattr_modr&   
is_symlinkr%   is_directory)r8   r9   rG   rU   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r2dS | jr<dS dS )NCreatedZRemovedZRenamedZModifiedZInodeMetaModZXattrModUnknown)rW   rX   rY   rZ   r[   r\   rC   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>)	typerQ   reprr9   ra   r^   hexrG   rU   )r8   sr;   r;   r<   __repr__   s      zNativeEvent.__repr__N)rQ   rR   rS   r)   propertyra   rf   r;   r;   r;   r<   rE      s   
rE   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 rB   )superr)   r'   r9   	_fseventsstart)r8   Zevent_queueZwatchtimeout	__class__r;   r<   r)      s    zFSEventsEmitter.__init__c                 C   s   | j   d S rB   )rj   rD   rC   r;   r;   r<   on_thread_stop   s    zFSEventsEmitter.on_thread_stopc                 C   s&  | j  }|d krd S d}|t|k r"|| }|jr\|d t|k r||d  jr||d  j|jd kr|jrxtnt}| ||j	||d  j	 | t
tj	|j	 | t
tj	||d  j	 |d7 }ntj	|j	r"|jrtnt}| ||j	 | t
tj	|j	 n8|jr.tnt}| ||j	 | t
tj	|j	 n|jst|jst|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 }qd S )Nr      )rj   rP   lenrY   rU   r^   r
   r   Zqueue_eventr9   r   r0   dirnameexistsr	   r   r   r   rZ   r[   r\   r   rW   rX   )r8   rl   rL   ieventclsr;   r;   r<   queue_events   sD    
 
zFSEventsEmitter.queue_events)	rQ   rR   rS   rT   r   r)   ro   rw   __classcell__r;   r;   rm   r<   rh      s   rh   c                       s    e Zd Zef fdd	Z  ZS )FSEventsObserver2c                    s   t  jt|d d S )N)Zemitter_classrl   )ri   r)   rh   )r8   rl   rm   r;   r<   r)      s    zFSEventsObserver2.__init__)rQ   rR   rS   r   r)   rx   r;   r;   rm   r<   ry      s   ry   );rT   r0   loggingr*   r2   warnings	threadingr   Zwatchdog.eventsr   r   r   r   r   r   r	   r
   Zwatchdog.observers.apir   r   r   r   r=   ZFSEventsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   	getLoggerrQ   rJ   messagewarnDeprecationWarningwarningr'   rE   rh   ry   r;   r;   r;   r<   <module>   s&   (
,D

=&@