
    g%                       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    M/var/www/openai/venv/lib/python3.12/site-packages/watchdog/tricks/__init__.py<lambda>r   +   s    V[[=M    )writec                  *    e Zd ZdZddZedd       Zy)Trickz'Your tricks should subclass this class.c                4    dt        |       j                   dS )N<>)type__name__selfs    r   __repr__zTrick.__repr__1   s    4:&&'q))r   c                <    d| j                    d| j                   dS )Nz- .z:
  args:
  - argument1
  - argument2
  kwargs:
    patterns:
    - "*.py"
    - "*.js"
    ignore_patterns:
    - "version.py"
    ignore_directories: false
)
__module__r   )clss    r   generate_yamlzTrick.generate_yaml4   s'    cnn%Qs||n 5  	r   N)returnstr)r   r!   __qualname____doc__r   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)   r   events     r   on_any_eventzLoggerTrick.on_any_eventG   s    r   Nr.   r   r$   None)r   r!   r&   r'   echo_eventsr/   r)   r   r   r+   r+   D   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r5   r6   r7   )super__init__shell_commandr8   r9   processset_process_watchers)r   r>   r5   r6   r7   r8   r9   	__class__s          r   r=   zShellCommandTrick.__init__O   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}"rI   T)shellr)   )
event_typer   r   stringrD   r9   is_process_runningis_directorysrc_pathr>   hasattrrL   safe_substitute
subprocessPopenr?   r8   waitr   rA   add	functoolspartialdiscardprocess_termination_callbackstart)r   r.   rD   object_typecontextcommandprocess_watchers          r   r/   zShellCommandTrick.on_any_evente   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   )boolrA   r?   pollr   s    r   rP   z$ShellCommandTrick.is_process_running   s9    D**ht||4/G/gDLLL]L]L_cgLgiir   )r>   r%   r5   list[str] | Noner6   re   r7   rc   r8   rc   r9   rc   r0   )r$   rc   )r   r!   r&   r'   r=   r/   rP   __classcell__rB   s   @r   r4   r4   L   sb    @ &*,0#(!&$)<< #	<
 *< !< < "<,($Tjr   r4   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)r5   r6   r7   stop_signal
kill_afterdebounce_interval_secondsrestart_on_command_exitc                  |dk  rd}	t        |	      |dk  rd}	t        |	      t        
| 	  |||       || _        t	        |t
        j                        r|j                  n|| _        || _	        || _
        || _        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.r;   F)
ValueErrorr<   r=   r`   
isinstancesignalSignalsvaluerk   rl   rm   rn   r?   ra   event_debouncerrestart_count_is_process_stopping_is_trick_stopping	threadingRLock_stopping_lock)r   r`   r5   r6   r7   rk   rl   rm   rn   errorrB   s             r   r=   zAutoRestartTrick.__init__   s     >6EU##$q(EEU##+1 	 	
 0:;0W;,,]h$)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/Fr   )rm   events_callback)rm   r
   ru   r]   _start_processr   s   `r   r]   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)r{   rx   ra   ru   stop_stop_processjoin)r   ra   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)rx   rU   rV   r`   getattrosr?   rn   r   r   ra   r]   r   s    r   r   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)r{   rw   ra   r   r?   kill_processpidrk   timerl   rd   sleep
contextlibsuppressOSError)r   	kill_times     r   r   zAutoRestartTrick._stop_process   s@     (( !  )-D% !
	.##/$$))+'+$||'> !1!143C3CD
 !%		doo =I))+	1<<,,.:!

4( ))+	1 (009()9)91= :#(-D%9 ! 0 :9   ).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   )rN   r   r   ru   handle_eventr   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   )rx   r   r   rv   r   s    r   r   z!AutoRestartTrick._restart_process  s7    ""ar   )r`   z	list[str]r5   re   r6   re   r7   rc   rk   zsignal.Signals | intrl   intrm   r   rn   rc   )r$   r1   r0   )r   r!   r&   r'   rr   SIGINTr=   r]   r   r   r   r2   r/   r   rf   rg   s   @r   ri   ri      s     &*,0#(,2MM)*(,&0&0 #	&0
 *&0 !&0 *&0 &0 $'&0 "&&0P#$).@ $ $ r   ri   c                0    t        j                  | |       y r   )r   killr   rk   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   rk   r   r$   r1   )"r'   
__future__r   r   rY   loggingr   rr   rU   ry   r   watchdog.eventsr   r   r   r   watchdog.utilsr   r	   watchdog.utils.event_debouncerr
   watchdog.utils.process_watcherr   	getLoggerr   r   rZ   r2   r   r+   r4   ri   
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   