
    zc                         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  G d de          Z	 G d de	          Z
 G d	 d
e	          Z G 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)echo)PatternMatchingEventHandlerc                   (    e Zd ZdZed             ZdS )Trickz'Your tricks should subclass this class.c                 F    t          | j        | j                  }d}||z  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_yamls      8lib/python3.11/site-packages/watchdog/tricks/__init__.pygenerate_yamlzTrick.generate_yaml9   s3    3>"%,0 0 0 w&&    N)r   r   __qualname____doc__classmethodr    r   r   r   r   5   s3        11' ' [' ' 'r   r   c                       e Zd ZdZd Zej        d             Zej        d             Zej        d             Zej        d             Z	dS )LoggerTrickz*A simple trick that does only logs events.c                     d S Nr   selfevents     r   on_any_eventzLoggerTrick.on_any_eventP   s    r   c                     d S r   r   r   s     r   on_modifiedzLoggerTrick.on_modifiedS       r   c                     d S r   r   r   s     r   
on_deletedzLoggerTrick.on_deletedW   r!   r   c                     d S r   r   r   s     r   
on_createdzLoggerTrick.on_created[   r!   r   c                     d S r   r   r   s     r   on_movedzLoggerTrick.on_moved_   r!   r   N)
r   r   r   r   r   r   r    r#   r%   r'   r   r   r   r   r   L   s        44   
Y  Y 
Y  Y 
Y  Y 
Y  Y  r   r   c                   0     e Zd ZdZ	 	 	 d fd	Zd Z xZS )ShellCommandTrickz6Executes shell commands in response to matched events.NFc                     t                                          |||           || _        || _        || _        d | _        d S N)patternsignore_patternsignore_directories)super__init__shell_commandwait_for_processdrop_during_processprocess)r   r1   r,   r-   r.   r2   r3   	__class__s          r   r0   zShellCommandTrick.__init__h   sS     	1 	 	3 	3 	3 + 0#6 r   c                    ddl m} | j        r"| j        r| j                                        d S |j        rd}nd}|j        d|j        |d}| j        2t          |d          r|
                    d|j        i           d}n6d	}n3t          |d          r|
                    d
|j        i           | j        }  ||          j        di |}t          j        |d          | _        | j        r| j                                         d S 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   )stringr7   r3   r4   pollis_directorysrc_path
event_typer1   hasattrupdater?   safe_substitute
subprocessPopenr2   wait)r   r   r7   object_typer   commands         r   r   zShellCommandTrick.on_any_events   s\   ####### 	 	9J9J9L9L 	F 	!%KK K $n! % 0'	
 
  		)uk** YU_=>>>sXuk** E 15?CDDD(G3((7##3>>g>>!'t<<<  	 L	  	 r   )NNNFFF)r   r   r   r   r0   r   __classcell__r5   s   @r   r)   r)   d   s[        @@JN<A%*	 	 	 	 	 	                    r   r)   c                   d     e Zd ZdZdddej        df fd	Zd Zd Ze	j	        d             Z
 x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                     t                                          |||           || _        || _        || _        d | _        d S r+   )r/   r0   rM   stop_signal
kill_afterr4   )r   rM   r,   r-   r.   rT   rU   r5   s          r   r0   zAutoRestartTrick.__init__   sQ     	1 	 	3 	3 	3 &$r   c                 n    t          j        | j        t          t          dd                     | _        d S )Nsetsid)
preexec_fn)rI   rJ   rM   getattrosr4   )r   s    r   startzAutoRestartTrick.start   s,    !'XW[A\A\]]]r   c                      j         d S  fd}	  | j                   t          j                     j        z   }t          j                    |k     rE j                                         nHt          j        d           t          j                    |k     E	  |d           n!# t          $ r Y nw xY wn# t          $ r Y nw xY wd  _         d S )Nc                 
   t          t          d          rHt          t          d          r3t          j        t          j        j        j                  |            d S t          j        j        j        j                   d S )Ngetpgidkillpg)rF   rZ   r_   r^   r4   pidkillrT   )rT   r   s    r   kill_processz+AutoRestartTrick.stop.<locals>.kill_process   sm    r9%% <'"h*?*? <	"*T\%566DDDDD($*:;;;;;r   g      ?	   )r4   rT   timerU   rB   sleepOSError)r   rb   	kill_times   `  r   stopzAutoRestartTrick.stop   s   < 	F	< 	< 	< 	< 	<	L)***
 	do5I)++	) 	<$$&& 
4    )++	) 	
 LOOOO   D   	 	 	D	 s#   B6 B% %
B21B26
CCc                 V    |                                   |                                  d S r   )rh   r[   r   s     r   r   zAutoRestartTrick.on_any_event   s     		

r   )r   r   r   r   signalSIGINTr0   r[   rh   r   r   rN   rO   s   @r   rQ   rQ      s          *.t$)v}	 	 	 	 	 	^ ^ ^  : 
Y  Y    r   rQ   )r   rZ   rj   rI   rd   watchdog.utilsr   watchdog.eventsr   r   r   r)   rQ   r   r   r   <module>rn      s  $ 4 
			             7 7 7 7 7 7' ' ' ' '' ' ' '.    %   0/  /  /  /  /  /  /  / d: : : : :u : : : : :r   