o
    *ήc                     @   s   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ZddlmZ ddl	m
Z
 ddlmZ eeZeje
j
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dS )u  
:module: watchdog.tricks
:synopsis: Utility event handlers.
:author: yesudeep@google.com (Yesudeep Mangalapilly)
:author: contact@tiger-222.fr (Mickaël Schoentgen)

Classes
-------
.. autoclass:: Trick
   :members:
   :show-inheritance:

.. autoclass:: LoggerTrick
   :members:
   :show-inheritance:

.. autoclass:: ShellCommandTrick
   :members:
   :show-inheritance:

.. autoclass:: AutoRestartTrick
   :members:
   :show-inheritance:

    N)PatternMatchingEventHandler)echo)ProcessWatcherc                 C   s
   t | S N)loggerinfo)msg r	   ?/tmp/pip-target-vg8gfxp4/lib/python/watchdog/tricks/__init__.py<lambda>8   s   
 r   )writec                   @   s   e Zd ZdZedd ZdS )Trickz'Your tricks should subclass this class.c                 C   s   t | j| jd}d}|| S )N)module_name
klass_namez- %(module_name)s.%(klass_name)s:
  args:
  - argument1
  - argument2
  kwargs:
    patterns:
    - "*.py"
    - "*.js"
    ignore_patterns:
    - "version.py"
    ignore_directories: false
)dict
__module____name__)clscontexttemplate_yamlr	   r	   r
   generate_yaml?   s
   zTrick.generate_yamlN)r   r   __qualname____doc__classmethodr   r	   r	   r	   r
   r   ;   s    r   c                   @   sH   e Zd ZdZdd Zedd Zedd Zedd	 Zed
d Z	dS )LoggerTrickz*A simple trick that does only logs events.c                 C      d S r   r	   selfeventr	   r	   r
   on_any_eventV   s   zLoggerTrick.on_any_eventc                 C   r   r   r	   r   r	   r	   r
   on_modifiedY      zLoggerTrick.on_modifiedc                 C   r   r   r	   r   r	   r	   r
   
on_deleted]   r!   zLoggerTrick.on_deletedc                 C   r   r   r	   r   r	   r	   r
   
on_createda   r!   zLoggerTrick.on_createdc                 C   r   r   r	   r   r	   r	   r
   on_movede   r!   zLoggerTrick.on_movedN)
r   r   r   r   r   echo_eventsr    r"   r#   r$   r	   r	   r	   r
   r   R   s    


r   c                       s8   e Zd ZdZ			d
 fdd	Zdd Zdd	 Z  ZS )ShellCommandTrickz6Executes shell commands in response to matched events.NFc                    s6   t  j|||d || _|| _|| _d | _t | _d S N)patternsignore_patternsignore_directories)super__init__shell_commandwait_for_processdrop_during_processprocessset_process_watchers)r   r-   r(   r)   r*   r.   r/   	__class__r	   r
   r,   n   s   zShellCommandTrick.__init__c                 C   s   ddl m} | jr|  rd S |jrd}nd}|jd|j|d}| jd u r8t|dr5|	d|j
i d}nd	}nt|drE|	d
|j
i | j}||jdi |}tj|dd| _| jrd| j  d S t| jd }| j| t| jj||_|  d S )Nr   )Template	directoryfile )watch_src_pathwatch_dest_pathwatch_event_typewatch_object	dest_pathzWecho "${watch_event_type} ${watch_object} from ${watch_src_path} to ${watch_dest_path}"z<echo "${watch_event_type} ${watch_object} ${watch_src_path}"r:   T)shellr	   )stringr5   r/   is_process_runningis_directorysrc_path
event_typer-   hasattrupdater=   safe_substitute
subprocessPopenr0   r.   waitr   r2   add	functoolspartialdiscardprocess_termination_callbackstart)r   r   r5   object_typer   commandprocess_watcherr	   r	   r
   r   {   s8   


zShellCommandTrick.on_any_eventc                 C   s   | j p| jd uo| j d u S r   )r2   r0   pollr   r	   r	   r
   r@      s   z$ShellCommandTrick.is_process_running)NNNFFF)r   r   r   r   r,   r   r@   __classcell__r	   r	   r3   r
   r&   j   s    (r&   c                       sR   e Zd ZdZdddejdf fdd	Zdd Zd	d
 Ze	dd Z
dd Z  ZS )AutoRestartTricka  Starts a long-running subprocess and restarts it on matched events.

    The command parameter is a list of command arguments, such as
    `['bin/myserver', '-c', 'etc/myconfig.ini']`.

    Call `start()` after creating the Trick. Call `stop()` when stopping
    the process.
    NF
   c                    s4   t  j|||d || _|| _|| _d | _d | _d S r'   )r+   r,   rQ   stop_signal
kill_afterr0   rR   )r   rQ   r(   r)   r*   rX   rY   r3   r	   r
   r,      s   
zAutoRestartTrick.__init__c                 C   s8   t j| jttdd d| _t| j| j| _| j	  d S )Nsetsid)
preexec_fn)
rG   rH   rQ   getattrosr0   r   _restartrR   rO   rT   r	   r	   r
   rO      s   zAutoRestartTrick.startc                    s    j d u rd S  jd ur j  d  _ fdd}z| j W n	 ty*   Y n1w t  j }t |k rK j  d ur@ntd t |k s8z|d W n	 tyZ   Y nw d  _ d S )Nc                    sD   t tdrt tdrtt jj|  d S t jj j d S )Ngetpgidkillpg)rD   r]   r`   r_   r0   pidkillrX   )rX   rT   r	   r
   kill_process   s   z+AutoRestartTrick.stop.<locals>.kill_processg      ?	   )	r0   rR   stoprX   OSErrortimerY   rS   sleep)r   rc   	kill_timer	   rT   r
   re      s.   




zAutoRestartTrick.stopc                 C   s   |    d S r   )r^   r   r	   r	   r
   r      s   zAutoRestartTrick.on_any_eventc                 C   s   |    |   d S r   )re   rO   rT   r	   r	   r
   r^      s   zAutoRestartTrick._restart)r   r   r   r   signalSIGINTr,   rO   re   r%   r   r^   rU   r	   r	   r3   r
   rV      s    	!
rV   )r   rK   loggingr]   rj   rG   rg   watchdog.eventsr   watchdog.utilsr   watchdog.utils.process_watcherr   	getLoggerr   r   rL   r%   r   r   r&   rV   r	   r	   r	   r
   <module>   s    
=