
    ʆh%                       S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKJrJrJrJr  SSKJrJr  SSKJr  SSKJr  \R.                  " \5      r\R4                  " \R"                  S S	9r " S
 S\5      r " S S\5      r " S S\5      r " S S\5      r\R@                  " 5       (       a  SS jr!gSS jr!g)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                ,    [         R                  U 5      $ N)loggerinfo)msgs    P/opt/services/DDDS/venv/lib/python3.13/site-packages/watchdog/tricks/__init__.py<lambda>r   +   s    V[[=M    )writec                  6    \ rS rSrSrSS jr\SS j5       rSrg)Trick.   z'Your tricks should subclass this class.c                4    S[        U 5      R                   S3$ )N<>)type__name__selfs    r   __repr__Trick.__repr__1   s    4:&&'q))r   c                <    SU R                    SU R                   S3$ )Nz- .z:
  args:
  - argument1
  - argument2
  kwargs:
    patterns:
    - "*.py"
    - "*.js"
    ignore_patterns:
    - "version.py"
    ignore_directories: false
)
__module__r   )clss    r   generate_yamlTrick.generate_yaml4   s'    cnn%Qs||n 5  	r    N)returnstr)	r   r#   __qualname____firstlineno____doc__r   classmethodr%   __static_attributes__r'   r   r   r   r   .   s    1*  r   r   c                  ,    \ rS rSrSr\SS j5       rSrg)LoggerTrickD   z*A simple trick that does only logs events.c                    g r   r'   r   events     r   on_any_eventLoggerTrick.on_any_eventG   s    r   r'   Nr4   r   r(   None)r   r#   r*   r+   r,   echo_eventsr5   r.   r'   r   r   r0   r0   D   s    4 r   r0   c                  j   ^  \ rS rSrSrSSSSSS.           S
U 4S jjjrSS jrSS jrS	rU =r	$ )ShellCommandTrickL   z6Executes shell commands in response to matched events.NF)patternsignore_patternsignore_directorieswait_for_processdrop_during_processc               t   > [         TU ]  UUUS9  Xl        XPl        X`l        S U l        [        5       U l        g )Nr=   r>   r?   )super__init__shell_commandr@   rA   processset_process_watchers)r   rF   r=   r>   r?   r@   rA   	__class__s          r   rE   ShellCommandTrick.__init__O   sE     	+1 	 	

 + 0#6 7;69er   c                P   UR                   [        [        1;   a  g SSKJn  U R
                  (       a  U R                  5       (       a  g UR                  (       a  SOSnUR                  SUR                   US.nU R                  c&  [        US5      (       a  UR                  US'   SnO/S	nO,[        US5      (       a  UR                  US
'   U R                  nU" U5      R                  " S0 UD6n[        R                  " USS9U l        U R                   (       a  U R                  R#                  5         g [%        U R                  S 5      nU R&                  R)                  U5        [*        R,                  " U R&                  R.                  U5      Ul        UR3                  5         g )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}"rR   T)shellr'   )
event_typer   r   stringrM   rA   is_process_runningis_directorysrc_pathrF   hasattrrU   safe_substitute
subprocessPopenrG   r@   waitr   rI   add	functoolspartialdiscardprocess_termination_callbackstart)r   r4   rM   object_typecontextcommandprocess_watchers          r   r5   ShellCommandTrick.on_any_evente   sY    13MNN###(?(?(A(A%*%7%7kV#nn! % 0 0'	
 %uk**',$sXuk**-2__)*((G7#33>g>!''t<  LL,T\\4@O""&&7;D;L;L&&..<O8 !!#r   c                    [        U R                  =(       d1    U R                  S L=(       a    U R                  R                  5       S L 5      $ r   )boolrI   rG   pollr   s    r   rY   $ShellCommandTrick.is_process_running   s9    D**ht||4/G/gDLLL]L]L_cgLgiir   )rI   rA   rG   rF   r@   )rF   r)   r=   list[str] | Noner>   rp   r?   rm   r@   rm   rA   rm   r7   )r(   rm   )
r   r#   r*   r+   r,   rE   r5   rY   r.   __classcell__rJ   s   @r   r;   r;   L   sm    @ &*,0#(!&$)<< #	<
 *< !< < "< <,($Tj jr   r;   c                     ^  \ rS rSrSrSSS\R                  SSSS.               SU 4S	 jjjrSS
 jrSS jr	SS jr
SS jr\SS j5       rSS jrSrU =r$ )AutoRestartTrick   a  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=   r>   r?   stop_signal
kill_afterdebounce_interval_secondsrestart_on_command_exitc                 > US:  a  Sn	[        U	5      eUS:  a  Sn	[        U	5      e[        T
U ]	  UUUS9  Xl        [	        U[
        R                  5      (       a  UR                  OUU l        X`l	        Xpl
        Xl        S U l        S U l        S U l        SU l        SU l        SU l        [$        R&                  " 5       U l        g )Nr   z kill_after must be non-negative.z/debounce_interval_seconds must be non-negative.rC   F)
ValueErrorrD   rE   ri   
isinstancesignalSignalsvaluerw   rx   ry   rz   rG   rj   event_debouncerrestart_count_is_process_stopping_is_trick_stopping	threadingRLock_stopping_lock)r   ri   r=   r>   r?   rw   rx   ry   rz   errorrJ   s             r   rE   AutoRestartTrick.__init__   s     >6EU##$q(EEU##+1 	 	
 0:;0W0W;,,]h$)B&'>$7;6:6:$)!"''oo/r   c                   ^  T R                   (       a7  [        T R                   U 4S jS9T l        T R                  R                  5         T R	                  5         g )Nc                $   > TR                  5       $ r   )_restart_process)eventsr   s    r   r   (AutoRestartTrick.start.<locals>.<lambda>   s    t/D/D/Fr   )ry   events_callback)ry   r
   r   rf   _start_processr   s   `r   rf   AutoRestartTrick.start   sE    ))#1*.*H*H F$D    &&(r   c                   U R                      U R                  (       a
   S S S 5        g SU l        S S S 5        U R                  nU R                  b  U R                  R	                  5         U R                  5         U R                  b  U R                  R                  5         Ub  UR                  5         g g ! , (       d  f       N= f)NT)r   r   rj   r   stop_stop_processjoin)r   rj   s     r   r   AutoRestartTrick.stop   s      && !  '+D# !
 ..+  %%' +  %%'&  " ' ! s   B7B77
Cc                0   U R                   (       a  g [        R                  " U R                  [	        [
        SS 5      S9U l        U R                  (       a@  [        U R                  U R                  5      U l
        U R                  R                  5         g g )Nsetsid)
preexec_fn)r   r^   r_   ri   getattrosrG   rz   r   r   rj   rf   r   s    r   r   AutoRestartTrick._start_process   sk    "" "''XW[A\]''#1$,,@U@U#VD   &&( (r   c                p   U R                      U R                  (       a
   S S S 5        g SU l        S S S 5         U R                  b!  U R                  R                  5         S U l        U R                  b   [        U R                  R                  U R                  5        [        R                  " 5       U R                  -   n[        R                  " 5       U:  aM  U R                  R                  5       b  Ot[        R                  " S5        [        R                  " 5       U:  a  MM  [        R                  " [        5         [        U R                  R                  S5        S S S 5        S U l        SU l        g ! , (       d  f       GNP= f! , (       d  f       N/= f! [         a     N>f = f! SU l        f = f)NTg      ?	   F)r   r   rj   r   rG   kill_processpidrw   timerx   rn   sleep
contextlibsuppressOSError)r   	kill_times     r   r   AutoRestartTrick._stop_process   s@     (( !  )-D% !
	.##/$$))+'+$||'> !1!143C3CD
 !%		doo =I))+	1<<,,.:!

4( ))+	1 (009()9)91= :#(-D%9 ! 0 :9   ).D%s^   E9E9;F, 5*F BF, 'F, !F"F, 9
F
FF, 
F)&F, (F))F, ,	F5c                    UR                   [        [        1;   a  g U R                  b  U R                  R	                  U5        g U R                  5         g r   )rW   r   r   r   handle_eventr   r3   s     r   r5   AutoRestartTrick.on_any_event
  sF     13MNN+  --e4!!#r   c                    U R                   (       a  g U R                  5         U R                  5         U =R                  S-  sl        g )N   )r   r   r   r   r   s    r   r   !AutoRestartTrick._restart_process  s7    ""ar   )r   r   r   ri   ry   r   rx   rG   rj   r   rz   rw   )ri   z	list[str]r=   rp   r>   rp   r?   rm   rw   zsignal.Signals | intrx   intry   r   rz   rm   )r(   r8   r7   )r   r#   r*   r+   r,   r~   SIGINTrE   rf   r   r   r   r9   r5   r   r.   rq   rr   s   @r   rt   rt      s     &*,0#(,2MM)*(,&0&0 #	&0
 *&0 !&0 *&0 &0 $'&0 "&&0 &0P#$).@ $ $   r   rt   c                0    [         R                  " X5        g r   )r   killr   rw   s     r   r   r     s    
!r   c                Z    [         R                  " [         R                  " U 5      U5        g r   )r   killpggetpgidr   s     r   r   r   $  s    
		"**S/;/r   )r   r   rw   r   r(   r8   )"r,   
__future__r   r   rb   loggingr   r~   r^   r   r   watchdog.eventsr   r   r   r   watchdog.utilsr   r	   watchdog.utils.event_debouncerr
   watchdog.utils.process_watcherr   	getLoggerr   r   rc   r9   r   r0   r;   rt   
is_windowsr   r'   r   r   <module>r      s   2 #    	     w w ) 9 9			8	$		1MN' ,% Dj DjNG u G T "
0r   