+
    Vß$g%  ã                  óš  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIHtHtHtHt ^ RIHtHt ^ RIHt ^ RIHt ]P.                  ! ]4      t]P4                  ! ]P"                  R R7      t ! R	 R
]4      t ! R R]4      t ! R R]4      t ! R R]4      t]P@                  ! 4       '       d	   R R lt!R# R R lt!R# )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                ó,   € \         P                  V 4      # ©N)ÚloggerÚinfo)Úmsgs   &Ú:/usr/lib/python3/dist-packages/watchdog/tricks/__init__.pyÚ<lambda>r   +   s   € ¼V¿[¹[ÈÔ=Mó    )Úwritec                  ó<   € ] tR t^.tRtR R lt]R R l4       tRtR# )ÚTrickz'Your tricks should subclass this class.c               ó   € V ^8„  d   QhRR/# ©é   ÚreturnÚstr© )Úformats   "r   Ú__annotate__ÚTrick.__annotate__1   s   € ÷ *ñ *˜#ñ *r   c                	ó4   € R \        V 4      P                   R2# )Ú<Ú>)ÚtypeÚ__name__©Úselfs   &r   Ú__repr__ÚTrick.__repr__1   s   € Ø”4˜“:×&Ñ&Ð' qÐ)Ð)r   c               ó   € V ^8„  d   QhRR/# r   r   )r   s   "r   r   r   5   s   € ÷ ñ ˜cñ r   c                	ó<   € R V P                    RV P                   R2# )z- Ú.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'   € à�c—n‘nÐ% Q s§|¡| nð 5ð ð 	r   r   N)	r#   r+   Ú__qualname__Ú__firstlineno__Ú__doc__r&   Úclassmethodr-   Ú__static_attributes__r   r   r   r   r   .   s   † Ù1õ*ð ôó ôr   r   c                  ó0   € ] tR t^DtRt]R R l4       tRtR# )ÚLoggerTrickz*A simple trick that does only logs events.c               ó    € V ^8„  d   QhRRRR/# ©r   Úeventr   r   ÚNoner   )r   s   "r   r   ÚLoggerTrick.__annotate__H   s   € ÷ ñ  /ð °dñ r   c                	ó   € R # r   r   ©r%   r8   s   &&r   Úon_any_eventÚLoggerTrick.on_any_eventG   s   € ár   r   N)r#   r+   r/   r0   r1   Úecho_eventsr=   r3   r   r   r   r5   r5   D   s   † Ù4àôó ôr   r5   c            
      ób   a € ] tR t^LtRtRRRRRRRRRR/R	 V 3R
 llltR R ltR R ltRtV ;t	# )ÚShellCommandTrickz6Executes shell commands in response to matched events.ÚpatternsNÚignore_patternsÚignore_directoriesFÚwait_for_processÚdrop_during_processc               ó0   € V ^8„  d   QhRRRRRRRRRRR	R/# )
r   Úshell_commandr   rB   úlist[str] | NonerC   rD   ÚboolrE   rF   r   )r   s   "r   r   ÚShellCommandTrick.__annotate__O   sF   € ÷ <ñ <àð<ð #ð	<ð
 *ð<ð !ð<ð ð<ð "ñ<r   c               	ó|   <€ \         SV `  VVVR 7       Wn        WPn        W`n        RV n        \        4       V n        R# )©rB   rC   rD   N)ÚsuperÚ__init__rH   rE   rF   ÚprocessÚsetÚ_process_watchers)r%   rH   rB   rC   rD   rE   rF   Ú	__class__s   &&$$$$$€r   rO   ÚShellCommandTrick.__init__O   sE   ø€ ô 	‰ÑØØ+Ø1ð 	ô 	
ð
 +ÔØ 0ÔØ#6Ô à7;ˆŒÜ69³eˆÖr   c               ó    € V ^8„  d   QhRRRR/# r7   r   )r   s   "r   r   rK   e   s   € ÷ ($ñ ($ /ð ($°dñ ($r   c                	ót  € VP                   \        \        09   d   R # ^ RIHp V P
                  '       d   V P                  4       '       d   R # VP                  '       d   RMRpRVP                  RRRVP                   RV/pV P                  f(   \        VR	4      '       d   VP                  VR	&   R
pM0RpM-\        VR	4      '       d   VP                  VR&   V P                  pV! V4      P                  ! R/ VB p\        P                  ! VRR7      V n        V P                   '       d   V P                  P#                  4        R # \%        V P                  R 4      pV P&                  P)                  V4       \*        P,                  ! V P&                  P.                  V4      Vn        VP3                  4        R # )N)Ú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}"T)Úshellr   )Ú
event_typer   r   ÚstringrW   rF   Úis_process_runningÚis_directoryÚsrc_pathrH   Úhasattrr_   Úsafe_substituteÚ
subprocessÚPopenrP   rE   Úwaitr
   rR   ÚaddÚ	functoolsÚpartialÚdiscardÚprocess_termination_callbackÚstart)r%   r8   rW   Úobject_typeÚcontextÚcommandÚprocess_watchers   &&     r   r=   ÚShellCommandTrick.on_any_evente   sj  € Ø×ÑÔ 1Ô3MÐNÔNáå#à×#×#Ð#¨×(?Ñ(?×(AÒ(AÙà%*×%7×%7Ð%7‘k¸Vˆà˜eŸn™nØ˜rØ × 0Ñ 0Ø˜Kð	
ˆð ×ÑÒ%Ü�u˜k×*Ò*Ø',§¡�˜Ñ$Øs‘àX‘ä�u˜k×*Ò*Ø-2¯_©_�Ð)Ñ*Ø×(Ñ(ˆGá˜7Ó#×3Ò3Ñ>°gÑ>ˆÜ!×'Ò'¨°tÔ<ˆŒØ× × Ð Ø�L‰L×ÑÖä,¨T¯\©\¸4Ó@ˆOØ×"Ñ"×&Ñ& Ô7Ü;D×;LÒ;LØ×&Ñ&×.Ñ.Øó<ˆOÔ8ð ×!Ñ!Ö#r   c               ó   € V ^8„  d   QhRR/# )r   r   rJ   r   )r   s   "r   r   rK   �   s   € ÷ jñ j Dñ jr   c                	ó    € \        V P                  ;'       g3    V P                  R J;'       d    V P                  P                  4       R J 4      # r   )rJ   rR   rP   Úpollr$   s   &r   rc   Ú$ShellCommandTrick.is_process_running�   s?   € Ü�D×*Ñ*×hÐh¨t¯|©|À4Ð/G×/gÐ/gÈDÏLÉL×L]ÑL]ÓL_ÐcgÐLgÓiÐir   )rR   rF   rP   rH   rE   )
r#   r+   r/   r0   r1   rO   r=   rc   r3   Ú__classcell__©rS   s   @r   rA   rA   L   sT   ø† Ù@ð<ð &*ð	<ð
 -1ð<ð $)ð<ð "'ð<ð %*÷<ò <õ,($÷Tjó jr   rA   c                  ó¸   a € ] tR t^“tRtRRRRRRR]P                  R^
R	^ R
R/R V 3R llltR R ltR R lt	R R lt
R R lt]R R l4       tR R ltRtV ;t# )Ú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.
rB   NrC   rD   FÚstop_signalÚ
kill_afterÚdebounce_interval_secondsÚrestart_on_command_exitTc               ó8   € V ^8„  d   QhRRRRRRRRRR	R
RRRRR/# )r   rs   z	list[str]rB   rI   rC   rD   rJ   r~   zsignal.Signals | intr   Úintr€   r�   r   )r   s   "r   r   ÚAutoRestartTrick.__annotate__�   sZ   € ÷ &0ñ &0àð&0ð #ð	&0ð
 *ð&0ð !ð&0ð *ð&0ð ð&0ð $'ð&0ð "&ñ&0r   c               	óš  <€ V^ 8  d   Rp	\        V	4      hV^ 8  d   Rp	\        V	4      h\        S
V `	  VVVR7       Wn        \	        V\
        P                  4      '       d   VP                  MTV n        W`n	        Wpn
        W€n        RV n        RV n        RV n        ^ V n        RV n        RV n        \$        P&                  ! 4       V n        R# )é    z kill_after must be non-negative.z/debounce_interval_seconds must be non-negative.rM   NF)Ú
ValueErrorrN   rO   rs   Ú
isinstanceÚsignalÚSignalsÚvaluer~   r   r€   r�   rP   rt   Úevent_debouncerÚrestart_countÚ_is_process_stoppingÚ_is_trick_stoppingÚ	threadingÚRLockÚ_stopping_lock)r%   rs   rB   rC   rD   r~   r   r€   r�   ÚerrorrS   s   &&$$$$$$$ €r   rO   ÚAutoRestartTrick.__init__�   sÆ   ø€ ð ˜Œ>Ø6ˆEÜ˜UÓ#Ð#Ø$ qÔ(ØEˆEÜ˜UÓ#Ð#ä‰ÑØØ+Ø1ð 	ô 	
ð ŒÜ0:¸;ÌÏÉ×0WÒ0W˜;×,Ò,Ð]hˆÔØ$ŒØ)BÔ&Ø'>Ô$à7;ˆŒØ6:ˆÔØ6:ˆÔØˆÔà$)ˆÔ!Ø"'ˆÔÜ'ŸošoÓ/ˆÖr   c               ó   € V ^8„  d   QhRR/# ©r   r   r9   r   )r   s   "r   r   r„   Å   s   € ÷ ñ �tñ r   c                	óÀ   a € S P                   '       d;   \        S P                   V 3R  lR7      S n        S P                  P                  4        S P	                  4        R# )c                ó$   <€ SP                  4       # r   )Ú_restart_process)Úeventsr%   s   &€r   r   Ú(AutoRestartTrick.start.<locals>.<lambda>É   s   ø€ ¨t×/DÑ/DÔ/Fr   )r€   Úevents_callbackN)r€   r	   rŒ   rp   Ú_start_processr$   s   fr   rp   ÚAutoRestartTrick.startÅ   sH   ø€ Ø×)×)Ð)Ü#1Ø*.×*HÑ*HÜ Fô$ˆDÔ ð × Ñ ×&Ñ&Ô(Ø×ÑÖr   c               ó   € V ^8„  d   QhRR/# r–   r   )r   s   "r   r   r„   Î   s   € ÷ #ñ #�dñ #r   c                	ó²  € V P                   ;_uu_ 4        V P                  '       d    R R R 4       R # RV n        R R R 4       V P                  pV P                  e   V P                  P	                  4        V P                  4        V P                  e   V P                  P                  4        Ve   VP                  4        R # R #   + '       g   i     L”; i)NT)r’   r�   rt   rŒ   ÚstopÚ_stop_processÚjoin)r%   rt   s   & r   r¡   ÚAutoRestartTrick.stopÎ   s«   € à× × Ó Ø×&×&Ð&Ø÷ !Ñ ð '+ˆDÔ#÷ !ð
 ×.Ñ.ˆØ×ÑÒ+Ø× Ñ ×%Ñ%Ô'Ø×ÑÔð ×ÑÒ+Ø× Ñ ×%Ñ%Ô'ØÒ&Ø× Ñ Ö"ñ '÷ !× ús   •C³CÃC	c               ó   € V ^8„  d   QhRR/# r–   r   )r   s   "r   r   r„   à   s   € ÷ )ñ ) ñ )r   c                	ó@  € V P                   '       d   R # \        P                  ! V P                  \	        \
        RR 4      R7      V n        V P                  '       dB   \        V P                  V P                  4      V n
        V P                  P                  4        R # R # )NÚsetsid)Ú
preexec_fn)r�   rh   ri   rs   ÚgetattrÚosrP   r�   r
   r™   rt   rp   r$   s   &r   r�   ÚAutoRestartTrick._start_processà   sq   € Ø×"×"Ð"Ùô "×'Ò'¨¯©ÄÌÈXÐW[ÓA\Ô]ˆŒØ×'×'Ð'Ü#1°$·,±,À×@UÑ@UÓ#VˆDÔ Ø× Ñ ×&Ñ&Ö(ñ (r   c               ó   € V ^8„  d   QhRR/# r–   r   )r   s   "r   r   r„   ê   s   € ÷ .ñ .˜tñ .r   c                	ó~  € V P                   ;_uu_ 4        V P                  '       d    R R R 4       R # RV n        R R R 4        V P                  e"   V P                  P                  4        R V n        V P                  eó    \        V P                  P                  V P                  4       \        P                  ! 4       V P                  ,           p\        P                  ! 4       V8  d6   V P                  P                  4       e   Mc\        P                  ! R4       KO  \        P                  ! \        4      ;_uu_ 4        \        V P                  P                  ^	4       R R R 4       R V n        RV n        R #   + '       g   i     ELJ; i  + '       g   i     L4; i  \         d     LDi ; i  RT n        i ; i)NTg      Ð?F)r’   rŽ   rt   r¡   rP   Úkill_processÚpidr~   Útimer   rx   ÚsleepÚ
contextlibÚsuppressÚOSError)r%   Ú	kill_times   & r   r¢   ÚAutoRestartTrick._stop_processê   s<  € à× × Ó Ø×(×(Ð(Ø÷ !Ñ ð )-ˆDÔ%÷ !ð
	.Ø×#Ñ#Ò/Ø×$Ñ$×)Ñ)Ô+Ø'+�Ô$à�|‰|Ò'ð>Ü  §¡×!1Ñ!1°4×3CÑ3CÔDô
 !%§	¢	£¨d¯o©oÕ =�IÜŸ)š)›+¨	Ô1ØŸ<™<×,Ñ,Ó.Ò:Ø!ÜŸ
š
 4Ö(ô (×0Ò0´×9Õ9Ü(¨¯©×)9Ñ)9¸1Ô=÷ :à#�”à(-ˆDÖ%÷9 !× Ð ú÷0 :×9ûô ô áðûð ).ˆDÕ%úsY   •E;³E;Á=F3 Â*F" Â+BF3 Å!FÅ#F3 Å;F	ÆF	ÆF3 Æ"F0Æ-F3 Æ/F0Æ0F3 Æ3	F<c               ó    € V ^8„  d   QhRRRR/# r7   r   )r   s   "r   r   r„     s   € ÷ $ñ $ /ð $°dñ $r   c                	ó¶   € VP                   \        \        09   d   R # V P                  e   V P                  P	                  V4       R # V P                  4        R # r   )ra   r   r   rŒ   Úhandle_eventr™   r<   s   &&r   r=   ÚAutoRestartTrick.on_any_event
  sF   € à×ÑÔ 1Ô3MÐNÔNáà×ÑÒ+Ø× Ñ ×-Ñ-¨eÖ4à×!Ñ!Ö#r   c               ó   € V ^8„  d   QhRR/# r–   r   )r   s   "r   r   r„     s   € ÷  ñ   $ñ  r   c                	ó    € V P                   '       d   R # V P                  4        V P                  4        V ;P                  ^,          un        R # r   )r�   r¢   r�   r�   r$   s   &r   r™   Ú!AutoRestartTrick._restart_process  s:   € Ø×"×"Ð"ÙØ×ÑÔØ×ÑÔØ×Ò˜aÕ×r   )rŽ   r�   r’   rs   r€   rŒ   r   rP   rt   r�   r�   r~   )r#   r+   r/   r0   r1   r‰   ÚSIGINTrO   rp   r¡   r�   r¢   r?   r=   r™   r3   rz   r{   s   @r   r}   r}   “   s�   ø† ñð&0ð &*ð	&0ð
 -1ð&0ð $)ð&0ð -3¯M©Mð&0ð ð&0ð *+ð&0ð )-÷&0ò &0õPõ#õ$)õ.ð@ ô$ó ð$÷ ó  r   r}   c               ó$   € V ^8„  d   QhRRRRRR/# ©r   r¯   rƒ   r~   r   r9   r   )r   s   "r   r   r     s!   € ÷ "ñ "˜#ð "¨Cð "°Dñ "r   c                ó2   € \         P                  ! W4       R # r   )rª   Úkill©r¯   r~   s   &&r   r®   r®     s   € Ü
�Š�Ö!r   c               ó$   € V ^8„  d   QhRRRRRR/# rÀ   r   )r   s   "r   r   r   $  s!   € ÷ 0ñ 0˜#ð 0¨Cð 0°Dñ 0r   c                ó\   € \         P                  ! \         P                  ! V 4      V4       R # r   )rª   ÚkillpgÚgetpgidrÃ   s   &&r   r®   r®   $  s   € Ü
�	Š	”"—*’*˜S“/ ;Ö/r   )"r1   Ú
__future__r   r²   rl   Úloggingrª   r‰   rh   r�   r°   Úwatchdog.eventsr   r   r   r   Úwatchdog.utilsr   r   Úwatchdog.utils.event_debouncerr	   Úwatchdog.utils.process_watcherr
   Ú	getLoggerr#   r   rm   r?   r   r5   rA   r}   Ú
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   