
    Ki$                       d Z ddlm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	Z	ddl
Z
ddlmZmZmZmZ ddlmZmZ ddlmZ ddlmZ  ej.                  e      Z ej4                  ej"                  d 	      Z G d
 de      Z G d de      Z G d de      Z G d de      Z ej@                         rddZ!yddZ!y)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:

    )annotationsN)EVENT_TYPE_CLOSED_NO_WRITEEVENT_TYPE_OPENEDFileSystemEventPatternMatchingEventHandler)echoplatform)EventDebouncer)ProcessWatcherc                ,    t         j                  |       S N)loggerinfo)msgs    d/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/watchdog/tricks/__init__.py<lambda>r   +   s    V[[=M     )writec                  "    e Zd ZdZedd       Zy)Trickz'Your tricks should subclass this class.c                <    d| j                    d| j                   dS )Nz- .z:
  args:
  - argument1
  - argument2
  kwargs:
    patterns:
    - "*.py"
    - "*.js"
    ignore_patterns:
    - "version.py"
    ignore_directories: false
)
__module____name__)clss    r   generate_yamlzTrick.generate_yaml1   s'    cnn%Qs||n 5  	r   N)returnstr)r   r   __qualname____doc__classmethodr    r   r   r   r   .   s    1 r   r   c                  "    e Zd ZdZedd       Zy)LoggerTrickz*A simple trick that does only logs events.c                     y r   r"   selfevents     r   on_any_eventzLoggerTrick.on_any_eventD   s    r   Nr(   r   r   None)r   r   r   r    echo_eventsr)   r"   r   r   r$   r$   A   s    4 r   r$   c                  X     e Zd ZdZdddddd	 	 	 	 	 	 	 	 	 	 	 d fdZd	dZd
dZ xZS )ShellCommandTrickz6Executes shell commands in response to matched events.NF)patternsignore_patternsignore_directorieswait_for_processdrop_during_processc                   t         |   |||       || _        || _        || _        d | _        t               | _        y )Nr/   r0   r1   )super__init__shell_commandr2   r3   processset_process_watchers)r'   r8   r/   r0   r1   r2   r3   	__class__s          r   r7   zShellCommandTrick.__init__L   sK     	+1 	 	

 + 0#6 7;69er   c                   |j                   t        t        hv ry ddlm} | j
                  r| j                         ry |j                  rdnd}|j                  d|j                   |d}| j                  !t        |d      r|j                  |d<   d}n*d	}n't        |d      r|j                  |d
<   | j                  }  ||      j                  di |}t        j                  |d      | _        | j                   r| j                  j#                          y t%        | j                  d       }| j&                  j)                  |       t+        j,                  | j&                  j.                  |      |_        |j3                          y )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}"rC   T)shellr"   )
event_typer   r   stringr>   r3   is_process_runningis_directorysrc_pathr8   hasattrrF   safe_substitute
subprocessPopenr9   r2   waitr   r;   add	functoolspartialdiscardprocess_termination_callbackstart)r'   r(   r>   object_typecontextcommandprocess_watchers          r   r)   zShellCommandTrick.on_any_eventb   sR    13MNN###(?(?(A%*%7%7kV#nn! % 0 0'	
 %uk*',$sXuk*-2__)*((G3(7#33>g>!''t<  LL,T\\4@O""&&7;D;L;L&&..<O8 !!#r   c                    t        | j                  xs, | j                  d uxr | j                  j                         d u       S r   )boolr;   r9   pollr'   s    r   rJ   z$ShellCommandTrick.is_process_running   s9    D**ht||4/G/gDLLL]L]L_cgLgiir   )r8   r   r/   list[str] | Noner0   r`   r1   r]   r2   r]   r3   r]   r*   )r   r]   )r   r   r   r    r7   r)   rJ   __classcell__r<   s   @r   r.   r.   I   sb    @ &*,0#(!&$)<< #	<
 *< !< < "<,($Tjr   r.   c                       e Zd ZdZdddej
                  dddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZdd	Zdd
ZddZ	ddZ
edd       Zd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
   r   T)r/   r0   r1   stop_signal
kill_afterdebounce_interval_secondsrestart_on_command_exitc               >   |dk  rd}	t        |	      |dk  rd}	t        |	      t        
| 	  |||       || _        || _        || _        || _        || _        d | _        d | _	        d | _
        d| _        d| _        d| _        t        j                         | _        y )Nr   z kill_after must be non-negative.z/debounce_interval_seconds must be non-negative.r5   F)
ValueErrorr6   r7   rZ   rf   rg   rh   ri   r9   r[   event_debouncerrestart_count_is_process_stopping_is_trick_stopping	threadingRLock_stopping_lock)r'   rZ   r/   r0   r1   rf   rg   rh   ri   errorr<   s             r   r7   zAutoRestartTrick.__init__   s     >6EU##$q(EEU##+1 	 	
 &$)B&'>$7;6:6:$)!"''oo/r   c                      j                   r9t         j                    fd       _         j                  j                           j	                          y )Nc                $    j                         S r   )_restart_process)eventsr'   s    r   r   z(AutoRestartTrick.start.<locals>.<lambda>   s    t/D/D/F r   )rh   events_callback)rh   r
   rl   rW   _start_processr_   s   `r   rW   zAutoRestartTrick.start   sE    ))#1*.*H*H F$D    &&(r   c                v   | j                   5  | j                  r
	 d d d        y d| _        d d d        | j                  }| j                  | j                  j	                          | j                          | j                  | j                  j                          ||j                          y y # 1 sw Y   xY w)NT)rr   ro   r[   rl   stop_stop_processjoin)r'   r[   s     r   r{   zAutoRestartTrick.stop   s       	+&&	+ 	+ '+D#	+
 ..+  %%' +  %%'&  " '	+ 	+s   B/B//B8c                    | j                   ry t        j                  | j                  t	        t
        dd             | _        | j                  r@t        | j                  | j                        | _
        | j                  j                          y y )Nsetsid)
preexec_fn)ro   rO   rP   rZ   getattrosr9   ri   r   rv   r[   rW   r_   s    r   ry   zAutoRestartTrick._start_process   sk    "" "''XW[A\]''#1$,,@U@U#VD   &&( (r   c                :   | j                   5  | j                  r
	 d d d        y d| _        d d d        	 | j                  !| j                  j                          d | _        | j                  	 t        | j                  j                  | j                         t        j                         | j                  z   }t        j                         |k  rH| j                  j                         not        j                  d       t        j                         |k  rHt        j                  t              5  t        | j                  j                  d       d d d        d | _        d| _        y # 1 sw Y   @xY w# 1 sw Y   %xY w# t        $ r Y 3w xY w# d| _        w xY w)NTg      ?	   F)rr   rn   r[   r{   r9   kill_processpidrf   timerg   r^   sleep
contextlibsuppressOSError)r'   	kill_times     r   r|   zAutoRestartTrick._stop_process   sP      	-((	- 	- )-D%	-
	.##/$$))+'+$||'> !1!143C3CD
 !%		doo =I))+	1<<,,.:!

4( ))+	1 (009 >()9)91=>#(-D%9	- 	-0> >   ).D%s^   E)E)9F .*F A?F F 1!E6F )E36E?;F 	FF FF 	Fc                    |j                   t        t        hv ry | j                  | j                  j	                  |       y | j                          y r   )rH   r   r   rl   handle_eventrv   r&   s     r   r)   zAutoRestartTrick.on_any_event  sF     13MNN+  --e4!!#r   c                    | j                   ry | j                          | j                          | xj                  dz  c_        y )N   )ro   r|   ry   rm   r_   s    r   rv   z!AutoRestartTrick._restart_process  s7    ""ar   )rZ   z	list[str]r/   r`   r0   r`   r1   r]   rf   zsignal.Signalsrg   intrh   r   ri   r]   )r   r+   r*   )r   r   r   r    signalSIGINTr7   rW   r{   ry   r|   r,   r)   rv   ra   rb   s   @r   rd   rd      s     &*,0#(&,mm)*(,&0&0 #	&0
 *&0 !&0 $&0 &0 $'&0 "&&0P#$).@ $ $ r   rd   c                0    t        j                  | |       y r   )r   killr   rf   s     r   r   r     s    
[!r   c                V    t        j                  t        j                  |       |       y r   )r   killpggetpgidr   s     r   r   r   !  s    
		"**S/;/r   )r   r   rf   r   r   r+   )"r    
__future__r   r   rS   loggingr   r   rO   rp   r   watchdog.eventsr   r   r   r   watchdog.utilsr   r	   watchdog.utils.event_debouncerr
   watchdog.utils.process_watcherr   	getLoggerr   r   rT   r,   r   r$   r.   rd   
is_windowsr   r"   r   r   <module>r      s   2 #    	     w w ) 9 9			8	$i		1MN' &% Dj DjNG u G T 8"
0r   