U
    ꥡcj?                     @   s<  d Z ddlZddlZddlZddlmZ dZdZdZ	dZ
dZG d	d
 d
ZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd  d ZG d!d" d"eZG d#d$ d$eZG d%d& d&eZd'd( Zd)d* ZdS )+u+  
:module: watchdog.events
:synopsis: File system events and event handlers.
:author: yesudeep@google.com (Yesudeep Mangalapilly)
:author: contact@tiger-222.fr (Mickaël Schoentgen)

Event Classes
-------------
.. autoclass:: FileSystemEvent
   :members:
   :show-inheritance:
   :inherited-members:

.. autoclass:: FileSystemMovedEvent
   :members:
   :show-inheritance:

.. autoclass:: FileMovedEvent
   :members:
   :show-inheritance:

.. autoclass:: DirMovedEvent
   :members:
   :show-inheritance:

.. autoclass:: FileModifiedEvent
   :members:
   :show-inheritance:

.. autoclass:: DirModifiedEvent
   :members:
   :show-inheritance:

.. autoclass:: FileCreatedEvent
   :members:
   :show-inheritance:

.. autoclass:: FileClosedEvent
   :members:
   :show-inheritance:

.. autoclass:: DirCreatedEvent
   :members:
   :show-inheritance:

.. autoclass:: FileDeletedEvent
   :members:
   :show-inheritance:

.. autoclass:: DirDeletedEvent
   :members:
   :show-inheritance:


Event Handler Classes
---------------------
.. autoclass:: FileSystemEventHandler
   :members:
   :show-inheritance:

.. autoclass:: PatternMatchingEventHandler
   :members:
   :show-inheritance:

.. autoclass:: RegexMatchingEventHandler
   :members:
   :show-inheritance:

.. autoclass:: LoggingEventHandler
   :members:
   :show-inheritance:

    N)match_any_pathsmovedZdeletedcreatedmodifiedclosedc                   @   sd   e Zd ZdZdZdZdZdd Zedd Z	dd	 Z
d
d Zedd Zdd Zdd Zdd ZdS )FileSystemEventa
  
    Immutable type that represents a file system event that is triggered
    when a change occurs on the monitored file system.

    All FileSystemEvent objects are required to be immutable and hence
    can be used as keys in dictionaries or be added to sets.
    NFc                 C   s
   || _ d S NZ	_src_path)selfsrc_path r   3/tmp/pip-unpacked-wheel-thtqfo2i/watchdog/events.py__init__   s    zFileSystemEvent.__init__c                 C   s   | j S )z@Source path of the file system object that triggered this event.r	   r
   r   r   r   r      s    zFileSystemEvent.src_pathc                 C   s   |   S r   )__repr__r   r   r   r   __str__   s    zFileSystemEvent.__str__c                 C   s   dt | jj| j| j| jd S )Nza<%(class_name)s: event_type=%(event_type)s, src_path=%(src_path)r, is_directory=%(is_directory)s>)
class_name
event_typer   is_directory)dict	__class____name__r   r   r   r   r   r   r   r      s    zFileSystemEvent.__repr__c                 C   s   | j | j| jfS r   )r   r   r   r   r   r   r   key   s    zFileSystemEvent.keyc                 C   s   | j |j kS r   r   r
   eventr   r   r   __eq__   s    zFileSystemEvent.__eq__c                 C   s   | j |j kS r   r   r   r   r   r   __ne__   s    zFileSystemEvent.__ne__c                 C   s
   t | jS r   )hashr   r   r   r   r   __hash__   s    zFileSystemEvent.__hash__)r   
__module____qualname____doc__r   r   is_syntheticr   propertyr   r   r   r   r   r   r   r   r   r   r   r   i   s   

r   c                       sD   e Zd ZdZeZ fddZedd Zedd Z	dd	 Z
  ZS )
FileSystemMovedEventzJ
    File system event representing any kind of file system movement.
    c                    s   t  | || _d S r   )superr   
_dest_path)r
   r   	dest_pathr   r   r   r      s    zFileSystemMovedEvent.__init__c                 C   s   | j S )z'The destination path of the move event.)r'   r   r   r   r   r(      s    zFileSystemMovedEvent.dest_pathc                 C   s   | j | j| j| jfS r   )r   r   r(   r   r   r   r   r   r      s    zFileSystemMovedEvent.keyc                 C   s   dt | jj| j| j| jd S )Nz_<%(class_name)s: src_path=%(src_path)r, dest_path=%(dest_path)r, is_directory=%(is_directory)s>)r   r   r(   r   )r   r   r   r   r(   r   r   r   r   r   r      s    zFileSystemMovedEvent.__repr__)r   r    r!   r"   EVENT_TYPE_MOVEDr   r   r$   r(   r   r   __classcell__r   r   r)   r   r%      s   

r%   c                   @   s   e Zd ZdZeZdS )FileDeletedEventz@File system event representing file deletion on the file system.N)r   r    r!   r"   EVENT_TYPE_DELETEDr   r   r   r   r   r,      s   r,   c                   @   s   e Zd ZdZeZdS )FileModifiedEventzDFile system event representing file modification on the file system.N)r   r    r!   r"   EVENT_TYPE_MODIFIEDr   r   r   r   r   r.      s   r.   c                   @   s   e Zd ZdZeZdS )FileCreatedEventz@File system event representing file creation on the file system.N)r   r    r!   r"   EVENT_TYPE_CREATEDr   r   r   r   r   r0      s   r0   c                   @   s   e Zd ZdZdS )FileMovedEventz@File system event representing file movement on the file system.N)r   r    r!   r"   r   r   r   r   r2      s   r2   c                   @   s   e Zd ZdZeZdS )FileClosedEventz=File system event representing file close on the file system.N)r   r    r!   r"   EVENT_TYPE_CLOSEDr   r   r   r   r   r3      s   r3   c                   @   s   e Zd ZdZeZdZdS )DirDeletedEventzEFile system event representing directory deletion on the file system.TN)r   r    r!   r"   r-   r   r   r   r   r   r   r5      s   r5   c                   @   s   e Zd ZdZeZdZdS )DirModifiedEventzS
    File system event representing directory modification on the file system.
    TN)r   r    r!   r"   r/   r   r   r   r   r   r   r6      s   r6   c                   @   s   e Zd ZdZeZdZdS )DirCreatedEventzEFile system event representing directory creation on the file system.TN)r   r    r!   r"   r1   r   r   r   r   r   r   r7      s   r7   c                   @   s   e Zd ZdZdZdS )DirMovedEventzEFile system event representing directory movement on the file system.TN)r   r    r!   r"   r   r   r   r   r   r8      s   r8   c                   @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )FileSystemEventHandlerzL
    Base file system event handler that you can override methods from.
    c              
   C   s:   |  | t| jt| jt| jt| jt	| j
i|j | dS )Dispatches events to the appropriate methods.

        :param event:
            The event object representing the file system event.
        :type event:
            :class:`FileSystemEvent`
        N)on_any_eventr1   
on_createdr-   
on_deletedr/   on_modifiedr*   on_movedr4   	on_closedr   r   r   r   r   dispatch  s     
     zFileSystemEventHandler.dispatchc                 C   s   dS )zCatch-all event handler.

        :param event:
            The event object representing the file system event.
        :type event:
            :class:`FileSystemEvent`
        Nr   r   r   r   r   r;     s    z#FileSystemEventHandler.on_any_eventc                 C   s   dS )zCalled when a file or a directory is moved or renamed.

        :param event:
            Event representing file/directory movement.
        :type event:
            :class:`DirMovedEvent` or :class:`FileMovedEvent`
        Nr   r   r   r   r   r?   !  s    zFileSystemEventHandler.on_movedc                 C   s   dS )zCalled when a file or directory is created.

        :param event:
            Event representing file/directory creation.
        :type event:
            :class:`DirCreatedEvent` or :class:`FileCreatedEvent`
        Nr   r   r   r   r   r<   *  s    z!FileSystemEventHandler.on_createdc                 C   s   dS )zCalled when a file or directory is deleted.

        :param event:
            Event representing file/directory deletion.
        :type event:
            :class:`DirDeletedEvent` or :class:`FileDeletedEvent`
        Nr   r   r   r   r   r=   3  s    z!FileSystemEventHandler.on_deletedc                 C   s   dS )zCalled when a file or directory is modified.

        :param event:
            Event representing file/directory modification.
        :type event:
            :class:`DirModifiedEvent` or :class:`FileModifiedEvent`
        Nr   r   r   r   r   r>   <  s    z"FileSystemEventHandler.on_modifiedc                 C   s   dS )zCalled when a file opened for writing is closed.

        :param event:
            Event representing file closing.
        :type event:
            :class:`FileClosedEvent`
        Nr   r   r   r   r   r@   E  s    z FileSystemEventHandler.on_closedN)r   r    r!   r"   rA   r;   r?   r<   r=   r>   r@   r   r   r   r   r9     s   					r9   c                       s^   e Zd ZdZd fdd	Zedd Zedd	 Zed
d Zedd Z	 fddZ
  ZS )PatternMatchingEventHandlerzR
    Matches given patterns with file paths associated with occurring events.
    NFc                    s&   t    || _|| _|| _|| _d S r   )r&   r   	_patterns_ignore_patterns_ignore_directories_case_sensitive)r
   patternsignore_patternsignore_directoriescase_sensitiver)   r   r   r   T  s
    
z$PatternMatchingEventHandler.__init__c                 C   s   | j S )zM
        (Read-only)
        Patterns to allow matching event paths.
        )rC   r   r   r   r   rG   ]  s    z$PatternMatchingEventHandler.patternsc                 C   s   | j S )zN
        (Read-only)
        Patterns to ignore matching event paths.
        )rD   r   r   r   r   rH   e  s    z+PatternMatchingEventHandler.ignore_patternsc                 C   s   | j S ze
        (Read-only)
        ``True`` if directories should be ignored; ``False`` otherwise.
        rE   r   r   r   r   rI   m  s    z.PatternMatchingEventHandler.ignore_directoriesc                 C   s   | j S z~
        (Read-only)
        ``True`` if path names should be matched sensitive to case; ``False``
        otherwise.
        rF   r   r   r   r   rJ   u  s    z*PatternMatchingEventHandler.case_sensitivec                    sn   | j r|jrdS g }t|dr0|t|j |jrH|t|j t|| j	| j
| jdrjt | dS )r:   Nr(   )Zincluded_patternsZexcluded_patternsrJ   )rI   r   hasattrappendosfsdecoder(   r   r   rG   rH   rJ   r&   rA   )r
   r   pathsr)   r   r   rA   ~  s    
z$PatternMatchingEventHandler.dispatch)NNFF)r   r    r!   r"   r   r$   rG   rH   rI   rJ   rA   r+   r   r   r)   r   rB   O  s       	



rB   c                       s^   e Zd ZdZd fdd	Zedd Zedd	 Zed
d Zedd Z	 fddZ
  ZS )RegexMatchingEventHandlerzQ
    Matches given regexes with file paths associated with occurring events.
    NFc                    s   t    |d krdg}nt|tr*|g}|d kr6g }|r\dd |D | _dd |D | _n dd |D | _dd |D | _|| _|| _d S )Nz.*c                 S   s   g | ]}t |qS r   recompile.0rr   r   r   
<listcomp>  s     z6RegexMatchingEventHandler.__init__.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   rU   rX   r   r   r   r[     s     c                 S   s   g | ]}t |t jqS r   rV   rW   IrX   r   r   r   r[     s     c                 S   s   g | ]}t |t jqS r   r\   rX   r   r   r   r[     s     )r&   r   
isinstancestr_regexes_ignore_regexesrE   rF   )r
   regexesignore_regexesrI   rJ   r)   r   r   r     s    

z"RegexMatchingEventHandler.__init__c                 C   s   | j S )zL
        (Read-only)
        Regexes to allow matching event paths.
        )r`   r   r   r   r   rb     s    z!RegexMatchingEventHandler.regexesc                 C   s   | j S )zM
        (Read-only)
        Regexes to ignore matching event paths.
        )ra   r   r   r   r   rc     s    z(RegexMatchingEventHandler.ignore_regexesc                 C   s   | j S rK   rL   r   r   r   r   rI     s    z,RegexMatchingEventHandler.ignore_directoriesc                 C   s   | j S rM   rN   r   r   r   r   rJ     s    z(RegexMatchingEventHandler.case_sensitivec                    s   | j r|jrdS g  t|dr0 t|j |jrH t|j t fdd| j	D rddS t fdd| j
D rt | dS )r:   Nr(   c                 3   s"   | ]} D ]}| |V  q
qd S r   matchrY   rZ   prS   r   r   	<genexpr>  s       z5RegexMatchingEventHandler.dispatch.<locals>.<genexpr>c                 3   s"   | ]} D ]}| |V  q
qd S r   rd   rf   rh   r   r   ri     s       )rI   r   rO   rP   rQ   rR   r(   r   anyrc   rb   r&   rA   r   r)   rh   r   rA     s    
z"RegexMatchingEventHandler.dispatch)NNFF)r   r    r!   r"   r   r$   rb   rc   rI   rJ   rA   r+   r   r   r)   r   rT     s       



rT   c                       sR   e Zd ZdZd fdd	Z fddZ fddZ fd	d
Z fddZ  Z	S )LoggingEventHandlerzLogs all the events captured.Nc                    s   t    |ptj| _d S r   )r&   r   loggingrootlogger)r
   rn   r)   r   r   r     s    
zLoggingEventHandler.__init__c                    s4   t  | |jrdnd}| jd||j|j d S )N	directoryfilezMoved %s: from %s to %s)r&   r?   r   rn   infor   r(   r
   r   whatr)   r   r   r?     s
    zLoggingEventHandler.on_movedc                    s0   t  | |jrdnd}| jd||j d S )Nro   rp   zCreated %s: %s)r&   r<   r   rn   rq   r   rr   r)   r   r   r<     s    zLoggingEventHandler.on_createdc                    s0   t  | |jrdnd}| jd||j d S )Nro   rp   zDeleted %s: %s)r&   r=   r   rn   rq   r   rr   r)   r   r   r=     s    zLoggingEventHandler.on_deletedc                    s0   t  | |jrdnd}| jd||j d S )Nro   rp   zModified %s: %s)r&   r>   r   rn   rq   r   rr   r)   r   r   r>     s    zLoggingEventHandler.on_modified)N)
r   r    r!   r"   r   r?   r<   r=   r>   r+   r   r   r)   r   rk     s   rk   c           
      c   s   t |D ]\}}}|D ]<}t j||}| r:||| nd}t||}d|_|V  q|D ]<}	t j||	}| r|||| nd}t||}d|_|V  qZq
dS )a  Generates an event list of :class:`DirMovedEvent` and
    :class:`FileMovedEvent` objects for all the files and directories within
    the given moved directory that were moved along with the directory.

    :param src_dir_path:
        The source path of the moved directory.
    :param dest_dir_path:
        The destination path of the moved directory.
    :returns:
        An iterable of file system events of type :class:`DirMovedEvent` and
        :class:`FileMovedEvent`.
    NT)rQ   walkpathjoinreplacer8   r#   r2   )
src_dir_pathZdest_dir_pathrm   directories	filenamesro   	full_pathZrenamed_pathr   filenamer   r   r   generate_sub_moved_events	  s    

r}   c                 c   sj   t | D ]Z\}}}|D ]"}tt j||}d|_|V  q|D ]"}tt j||}d|_|V  q@q
dS )a  Generates an event list of :class:`DirCreatedEvent` and
    :class:`FileCreatedEvent` objects for all the files and directories within
    the given moved directory that were moved along with the directory.

    :param src_dir_path:
        The source path of the created directory.
    :returns:
        An iterable of file system events of type :class:`DirCreatedEvent` and
        :class:`FileCreatedEvent`.
    TN)rQ   rt   r7   ru   rv   r#   r0   )rx   rm   ry   rz   ro   r   r|   r   r   r   generate_sub_created_events%  s    r~   )r"   os.pathrQ   rl   rV   Zwatchdog.utils.patternsr   r*   r-   r1   r/   r4   r   r%   r,   r.   r0   r2   r3   r5   r6   r7   r8   r9   rB   rT   rk   r}   r~   r   r   r   r   <module>   s4   J;"		MGQ"