Ë
    äÞËj·$  ã                  óz  — 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 ddlmZmZ ddlmZ ddlmZ  ej,                  e«      Z ej2                  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>                  «       sd„ Z y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_OPENEDÚFileSystemEventÚPatternMatchingEventHandler)ÚechoÚplatform)ÚEventDebouncer)ÚProcessWatcherc                ó,   — t         j                  | «      S ©N)ÚloggerÚinfo)Úmsgs    úU/var/www/photos/backend/venv/lib/python3.12/site-packages/watchdog/tricks/__init__.pyú<lambda>r   :   s   € ¼V¿[¹[ÈÓ=M€ ó    )Úwritec                  ó    — e Zd ZdZe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_yaml@   s'   € à�c—n‘nÐ% Q s§|¡| nð 5ð ð 	r   N)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_eventS   s   € àr   N)r%   r   ÚreturnÚNone)r   r   r   r   Úecho_eventsr&   r   r   r   r!   r!   P   s   „ Ù4àòó ñr   r!   c                  ó<   ‡ — e Zd ZdZ	 	 	 	 	 	 dˆ fd„	Zd„ Zd„ Zˆ xZS )ÚShellCommandTrickz6Executes shell commands in response to matched events.c                ó€   •— t         ‰| �  |||¬«       || _        || _        || _        d | _        t        «       | _        y )N©ÚpatternsÚignore_patternsÚignore_directories)ÚsuperÚ__init__Úshell_commandÚwait_for_processÚdrop_during_processÚprocessÚsetÚ_process_watchers)r$   r3   r.   r/   r0   r4   r5   Ú	__class__s          €r   r2   zShellCommandTrick.__init__[   sK   ø€ ô 	‰ÑØØ+Ø1ð 	ô 	
ð
 +ˆÔØ 0ˆÔØ#6ˆÔ àˆŒÜ!$£ˆÕr   c                ó  — |j                   t        k(  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,                  |«      |_        |j1                  «        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}"r@   T)Úshellr   )Ú
event_typer   Ústringr;   r5   Úis_process_runningÚis_directoryÚsrc_pathr3   ÚhasattrrC   Úsafe_substituteÚ
subprocessÚPopenr6   r4   Úwaitr
   r8   ÚaddÚ	functoolsÚpartialÚdiscardÚprocess_termination_callbackÚstart)r$   r%   r;   Úobject_typeÚcontextÚcommandÚprocess_watchers          r   r&   zShellCommandTrick.on_any_eventp   sL  € Ø×ÑÔ0Ò0àå#à×#Ò#¨×(?Ñ(?Ô(AØà%*×%7Ò%7‘k¸Vˆà#Ÿn™nØ!Ø %× 0Ñ 0Ø'ñ	
ˆð ×ÑÐ%Ü�u˜kÔ*Ø',§¡�˜Ñ$Øs‘àX‘ä�u˜kÔ*Ø-2¯_©_�Ð)Ñ*Ø×(Ñ(ˆGà3‘(˜7Ó#×3Ñ3Ñ>°gÑ>ˆÜ!×'Ñ'¨°tÔ<ˆŒØ× Ò Ø�L‰L×ÑÕä,¨T¯\©\¸4Ó@ˆOØ×"Ñ"×&Ñ& Ô7Ü;D×;LÑ;LØ×&Ñ&×.Ñ.Øó<ˆOÔ8ð ×!Ñ!Õ#r   c                óv   — | j                   xs, | j                  d uxr | j                  j                  «       d u S r   )r8   r6   Úpoll©r$   s    r   rG   z$ShellCommandTrick.is_process_runningš   s4   € Ø×%Ñ%Òc¨$¯,©,¸dÐ*BÒ*bÀtÇ|Á|×GXÑGXÓGZÐ^bÐGbÐcr   )NNNFFF)r   r   r   r   r2   r&   rG   Ú__classcell__©r9   s   @r   r+   r+   X   s+   ø„ Ù@ð ØØØ ØØ!õ'ò*($öTdr   r+   c                  ót   ‡ — e Zd ZdZdddej
                  dddfˆ fd„	Zd„ Zd	„ Zd
„ Z	d„ Z
ed„ «       Z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   Tc	                ó6  •— |dk  rt        d«      ‚|dk  rt        d«      ‚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.r-   F)Ú
ValueErrorr1   r2   rW   Ústop_signalÚ
kill_afterÚdebounce_interval_secondsÚrestart_on_command_exitr6   rX   Úevent_debouncerÚrestart_countÚ_is_process_stoppingÚ_is_trick_stoppingÚ	threadingÚRLockÚ_stopping_lock)
r$   rW   r.   r/   r0   rc   rd   re   rf   r9   s
            €r   r2   zAutoRestartTrick.__init__¨   s­   ø€ ð ˜Š>ÜÐ?Ó@Ð@Ø$ qÒ(ÜÐNÓOÐOä‰ÑØØ+Ø1ð 	ô 	
ð ˆŒØ&ˆÔØ$ˆŒØ)BˆÔ&Ø'>ˆÔ$àˆŒØ#ˆÔØ#ˆÔØˆÔà$)ˆÔ!Ø"'ˆÔÜ'Ÿo™oÓ/ˆÕ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   )re   Úevents_callback)re   r	   rg   rT   Ú_start_processr[   s   `r   rT   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)rm   rj   rX   rg   ÚstopÚ_stop_processÚjoin)r$   rX   s     r   ru   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)rj   rL   rM   rW   ÚgetattrÚosr6   rf   r
   rp   rX   rT   r[   s    r   rs   zAutoRestartTrick._start_processè   sk   € Ø×"Ò"Øô "×'Ñ'¨¯©ÄÌÈXÐW[ÓA\Ô]ˆŒØ×'Ò'Ü#1°$·,±,À×@UÑ@UÓ#VˆDÔ Ø× Ñ ×&Ñ&Õ(ð (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)rm   ri   rX   ru   r6   Úkill_processÚpidrc   Útimerd   rZ   ÚsleepÚ
contextlibÚsuppressÚOSError)r$   Ú	kill_times     r   rv   zAutoRestartTrick._stop_processò   sP  € à× Ñ ñ 	-Ø×(Ò(Ø÷	-ð 	-ð )-ˆDÔ%÷	-ð
	.Ø×#Ñ#Ð/Ø×$Ñ$×)Ñ)Ô+Ø'+�Ô$à�|‰|Ð'ð>Ü  §¡×!1Ñ!1°4×3CÑ3CÔDô
 !%§	¡	£¨d¯o©oÑ =�IÜŸ)™)›+¨	Ò1ØŸ<™<×,Ñ,Ó.Ð:Ø!ÜŸ
™
 4Ô(ô Ÿ)™)›+¨	Ó1ô (×0Ñ0´Ó9ñ >Ü(¨¯©×)9Ñ)9¸1Ô=÷>à#�”à(-ˆ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        k(  ry | j                  �| j                  j                  |«       y | j	                  «        y r   )rE   r   rg   Úhandle_eventrp   r#   s     r   r&   zAutoRestartTrick.on_any_event  s@   € à×ÑÔ0Ò0àà×ÑÐ+Ø× Ñ ×-Ñ-¨eÕ4à×!Ñ!Õ#r   c                óˆ   — | j                   ry | j                  «        | j                  «        | xj                  dz  c_        y )Né   )rj   rv   rs   rh   r[   s    r   rp   z!AutoRestartTrick._restart_process  s7   € Ø×"Ò"ØØ×ÑÔØ×ÑÔØ×Ò˜aÑÖr   )r   r   r   r   ÚsignalÚSIGINTr2   rT   ru   rs   rv   r)   r&   rp   r\   r]   s   @r   r_   r_   ž   sW   ø„ ñð ØØ Ø—M‘MØØ"#Ø $õ#0òJò#ò$)ò.ð@ ñ$ó ð$ö r   r_   c                óV   — t        j                  t        j                  | «      |«       y r   )r|   ÚkillpgÚgetpgid©r€   rc   s     r   r   r   '  s   € Ü
�	‰	”"—*‘*˜S“/ ;Õ/r   c                ó0   — t        j                  | |«       y r   )r|   Úkillr�   s     r   r   r   ,  s   € Ü
�‰��[Õ!r   )!r   Ú
__future__r   rƒ   rP   Úloggingr|   r‹   rL   rk   r�   Úwatchdog.eventsr   r   r   Úwatchdog.utilsr   r   Úwatchdog.utils.event_debouncerr	   Úwatchdog.utils.process_watcherr
   Ú	getLoggerr   r   rQ   r)   r   r!   r+   r_   Ú
is_windowsr   r   r   r   ú<module>r›      s´   ðñ õ2 #ã Û Û Û 	Û Û Û Û ç [Ñ [ß )Ý 9Ý 9à	ˆ×	Ñ	˜8Ó	$€Øˆi×Ñ §	¡	Ñ1MÔN€ôÐ'ô ô&�%ô ôCd˜ô CdôLD �uô D ðN €x×ÑÔó0ó
"r   