§
    xÅj%  ã                  óˆ  — 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j        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!dS dd„Z!dS )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                ó6   — t                                | ¦  «        S ©N)ÚloggerÚinfo)Úmsgs    úIC:\Projects\Historical\venv\Lib\site-packages\watchdog/tricks/__init__.pyú<lambda>r   +   s   € ½V¿[º[ÈÑ=MÔ=M€ ó    )Úwritec                  ó2   — e Zd ZdZdd„Zedd„¦   «         ZdS )ÚTrickz'Your tricks should subclass this class.ÚreturnÚstrc                ó2   — dt          | ¦  «        j        › d�S )Nú<ú>)ÚtypeÚ__name__©Úselfs    r   Ú__repr__zTrick.__repr__1   s   € Ø)•4˜‘:”:Ô&Ð)Ð)Ð)Ð)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-   € ð�c”nð ð  s¤|ð ð ð ð 	r   N)r   r   )r   r#   Ú__qualname__Ú__doc__r    Úclassmethodr%   © r   r   r   r   .   sN   € € € € € Ø1Ð1ð*ð *ð *ð *ð ðð ð ñ „[ðð ð r   r   c                  ó*   — e Zd ZdZedd„¦   «         ZdS )	ÚLoggerTrickz*A simple trick that does only logs events.Úeventr   r   ÚNonec                ó   — d S r   r)   ©r   r,   s     r   Úon_any_eventzLoggerTrick.on_any_eventG   s   € àˆr   N©r,   r   r   r-   )r   r#   r&   r'   Úecho_eventsr0   r)   r   r   r+   r+   D   s8   € € € € € Ø4Ð4àðð ð ñ „[ðð ð r   r+   c                  óB   ‡ — 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_processÚshell_commandr   r5   úlist[str] | Noner6   r7   Úboolr8   r9   c               ó®   •— t          ¦   «                              |||¬¦  «         || _        || _        || _        d | _        t          ¦   «         | _        d S )N©r5   r6   r7   )ÚsuperÚ__init__r:   r8   r9   ÚprocessÚsetÚ_process_watchers)r   r:   r5   r6   r7   r8   r9   Ú	__class__s          €r   r@   zShellCommandTrick.__init__O   sb   ø€ õ 	‰Œ×ÒØØ+Ø1ð 	ñ 	
ô 	
ð 	
ð
 +ˆÔØ 0ˆÔØ#6ˆÔ à7;ˆŒÝ69±e´eˆÔÐÐr   r,   r   r   r-   c                ó¶  — |j         t          t          hv rd S ddlm} | j        r|                      ¦   «         rd S |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                             ¦   «          d S t%          | j        d ¦  «        }| j                             |¦  «         t+          j        | j        j        |¦  «        |_        |                     ¦   «          d S )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}"rK   T)Úshellr)   )Ú
event_typer   r   ÚstringrF   r9   Úis_process_runningÚis_directoryÚsrc_pathr:   ÚhasattrrN   Úsafe_substituteÚ
subprocessÚPopenrA   r8   Úwaitr   rC   ÚaddÚ	functoolsÚpartialÚdiscardÚprocess_termination_callbackÚstart)r   r,   rF   Úobject_typeÚcontextÚcommandÚprocess_watchers          r   r0   zShellCommandTrick.on_any_evente   sŸ  € ØÔÕ 1Õ3MÐNÐNÐNàˆFà#Ð#Ð#Ð#Ð#Ð#àÔ#ð 	¨×(?Ò(?Ñ(AÔ(Að 	ØˆFà%*Ô%7ÐC�k�k¸Vˆà#œnØ!Ø %Ô 0Ø'ð	
ð 
ˆð ÔÐ%Ý�u˜kÑ*Ô*ð YØ',¤�˜Ñ$Øs��àX��å�u˜kÑ*Ô*ð =Ø-2¬_�Ð)Ñ*ØÔ(ˆGà3�(�(˜7Ñ#Ô#Ô3Ð>Ð>°gÐ>Ð>ˆÝ!Ô'¨°tÐ<Ñ<Ô<ˆŒØÔ ð 		$ØŒL×ÒÑÔÐÐÐå,¨T¬\¸4Ñ@Ô@ˆOØÔ"×&Ò& Ñ7Ô7Ð7Ý;DÔ;LØÔ&Ô.Øñ<ô <ˆOÔ8ð ×!Ò!Ñ#Ô#Ð#Ð#Ð#r   c                ór   — t          | j        p#| j        d uo| j                             ¦   «         d u ¦  «        S r   )r<   rC   rA   Úpollr   s    r   rR   z$ShellCommandTrick.is_process_running�   s8   € Ý�DÔ*Ðh¨t¬|À4Ð/GÐ/gÈDÌL×L]ÒL]ÑL_ÔL_ÐcgÐLgÑiÔiÐir   )r:   r   r5   r;   r6   r;   r7   r<   r8   r<   r9   r<   r1   )r   r<   )r   r#   r&   r'   r@   r0   rR   Ú__classcell__©rD   s   @r   r4   r4   L   s�   ø€ € € € € Ø@Ð@ð &*Ø,0Ø#(Ø!&Ø$)ð<ð <ð <ð <ð <ð <ð <ð <ð,($ð ($ð ($ð ($ðTjð jð jð jð jð jð jð 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_exitrb   ú	list[str]r5   r;   r6   r7   r<   rk   úsignal.Signals | intrl   Úintrm   rn   c               ó¸  •— |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        ¦   «         | _        d S )Nr   z kill_after must be non-negative.z/debounce_interval_seconds must be non-negative.r>   F)Ú
ValueErrorr?   r@   rb   Ú
isinstanceÚsignalÚSignalsÚvaluerk   rl   rm   rn   rA   rc   Úevent_debouncerÚrestart_countÚ_is_process_stoppingÚ_is_trick_stoppingÚ	threadingÚRLockÚ_stopping_lock)r   rb   r5   r6   r7   rk   rl   rm   rn   ÚerrorrD   s             €r   r@   zAutoRestartTrick.__init__�   sð   ø€ ð ˜Š>ˆ>Ø6ˆEÝ˜UÑ#Ô#Ð#Ø$ qÒ(Ð(ØEˆEÝ˜UÑ#Ô#Ð#å‰Œ×ÒØØ+Ø1ð 	ñ 	
ô 	
ð 	
ð ˆŒÝ0:¸;ÍÌÑ0WÔ0WÐh˜;Ô,Ð,Ð]hˆÔØ$ˆŒØ)BˆÔ&Ø'>ˆÔ$à7;ˆŒØ6:ˆÔØ6:ˆÔØˆÔà$)ˆÔ!Ø"'ˆÔÝ'œoÑ/Ô/ˆÔÐÐr   r   r-   c                ó¬   ‡ — ‰ j         r7t          ‰ j         ˆ fd„¬¦  «        ‰ _        ‰ j                             ¦   «          ‰                      ¦   «          d S )Nc                ó,   •— ‰                      ¦   «         S r   )Ú_restart_process)Úeventsr   s    €r   r   z(AutoRestartTrick.start.<locals>.<lambda>É   s   ø€ ¨t×/DÒ/DÑ/FÔ/F€ r   )rm   Úevents_callback)rm   r
   rx   r_   Ú_start_processr   s   `r   r_   zAutoRestartTrick.startÅ   sf   ø€ ØÔ)ð 	)Ý#1Ø*.Ô*HØ FÐ FÐ FÐ Fð$ñ $ô $ˆDÔ ð Ô ×&Ò&Ñ(Ô(Ð(Ø×ÒÑÔÐÐÐr   c                ób  — | j         5  | j        r	 d d d ¦  «         d S d| _        d d d ¦  «         n# 1 swxY w Y   | j        }| j        �| j                             ¦   «          |                      ¦   «          | j        �| j                             ¦   «          |�|                     ¦   «          d S d S )NT)r~   r{   rc   rx   ÚstopÚ_stop_processÚjoin)r   rc   s     r   r‡   zAutoRestartTrick.stopÎ   s   € àÔ ð 	+ð 	+ØÔ&ð Øð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð '+ˆDÔ#ð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+ð
 Ô.ˆØÔÐ+ØÔ ×%Ò%Ñ'Ô'Ð'Ø×ÒÑÔÐð ÔÐ+ØÔ ×%Ò%Ñ'Ô'Ð'ØÐ&Ø× Ò Ñ"Ô"Ð"Ð"Ð"ð 'Ð&s   ˆ	1ž1±5¸5c                ó  — | j         rd S t          j        | j        t	          t
          dd ¦  «        ¬¦  «        | _        | j        r:t          | j        | j	        ¦  «        | _
        | j
                             ¦   «          d S d S )NÚsetsid)Ú
preexec_fn)r{   rW   rX   rb   ÚgetattrÚosrA   rn   r   r‚   rc   r_   r   s    r   r…   zAutoRestartTrick._start_processà   s�   € ØÔ"ð 	ØˆFõ "Ô'¨¬ÅÍÈXÐW[ÑA\ÔA\Ð]Ñ]Ô]ˆŒØÔ'ð 	)Ý#1°$´,ÀÔ@UÑ#VÔ#VˆDÔ ØÔ ×&Ò&Ñ(Ô(Ð(Ð(Ð(ð	)ð 	)r   c                óô  — | j         5  | j        r	 d d d ¦  «         d S d| _        d d d ¦  «         n# 1 swxY w Y   	 | j        � | j                             ¦   «          d | _        | j        �ú	 t          | j        j        | j        ¦  «         t          j        ¦   «         | j	        z   }t          j        ¦   «         |k     rE| j         
                    ¦   «         �nvt          j        d¦  «         t          j        ¦   «         |k     °Et          j        t          ¦  «        5  t          | j        j        d¦  «         d d d ¦  «         n# 1 swxY w Y   n# t          $ r Y nw xY wd | _        d| _        d S # d| _        w xY w)NTg      Ð?é	   F)r~   rz   rc   r‡   rA   Úkill_processÚpidrk   Útimerl   re   ÚsleepÚ
contextlibÚsuppressÚOSError)r   Ú	kill_times     r   rˆ   zAutoRestartTrick._stop_processê   s  € àÔ ð 	-ð 	-ØÔ(ð Øð	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð )-ˆDÔ%ð	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð
	.ØÔ#Ð/ØÔ$×)Ò)Ñ+Ô+Ð+Ø'+�Ô$àŒ|Ð'ð>Ý  ¤Ô!1°4Ô3CÑDÔDÐDõ
 !%¤	¡¤¨d¬oÑ =�IÝœ)™+œ+¨	Ò1Ð1Øœ<×,Ò,Ñ.Ô.Ð:Ø!Ýœ
 4Ñ(Ô(Ð(õ œ)™+œ+¨	Ò1Ð1õ (Ô0µÑ9Ô9ð >ð >Ý(¨¬Ô)9¸1Ñ=Ô=Ð=ð>ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >øøõ ð ð ð à�Dðøøøð  $�”à(-ˆDÔ%Ð%Ð%ø¨ˆDÔ%Ð-Ð-Ð-Ð-sd   ˆ	1ž1±5¸5½.E. Á,E ÂBE. ÄEÄ6E. ÅEÅE. Å	EÅ
E. Å
EÅE. ÅEÅ
E. Å.	E7r,   r   c                ó¢   — |j         t          t          hv rd S | j        �| j                             |¦  «         d S |                      ¦   «          d S r   )rP   r   r   rx   Úhandle_eventr‚   r/   s     r   r0   zAutoRestartTrick.on_any_event
  sZ   € àÔÕ 1Õ3MÐNÐNÐNàˆFàÔÐ+ØÔ ×-Ò-¨eÑ4Ô4Ð4Ð4Ð4à×!Ò!Ñ#Ô#Ð#Ð#Ð#r   c                óˆ   — | j         rd S |                      ¦   «          |                      ¦   «          | xj        dz  c_        d S )Né   )r{   rˆ   r…   ry   r   s    r   r‚   z!AutoRestartTrick._restart_process  sP   € ØÔ"ð 	ØˆFØ×ÒÑÔÐØ×ÒÑÔÐØÐÔ˜aÑÐÔÐÐr   )rb   ro   r5   r;   r6   r;   r7   r<   rk   rp   rl   rq   rm   rq   rn   r<   )r   r-   r1   )r   r#   r&   r'   ru   ÚSIGINTr@   r_   r‡   r…   rˆ   r2   r0   r‚   rf   rg   s   @r   ri   ri   “   sð   ø€ € € € € ðð ð &*Ø,0Ø#(Ø,2¬MØØ)*Ø(,ð&0ð &0ð &0ð &0ð &0ð &0ð &0ð &0ðPð ð ð ð#ð #ð #ð #ð$)ð )ð )ð )ð.ð .ð .ð .ð@ ð$ð $ð $ñ „[ð$ð ð  ð  ð  ð  ð  ð  ð  r   ri   r’   rq   rk   r   r-   c                ó0   — t          j        | |¦  «         d S r   )rŽ   Úkill©r’   rk   s     r   r‘   r‘     s   € Ý
Œ��[Ñ!Ô!Ð!Ð!Ð!r   c                óT   — t          j        t          j        | ¦  «        |¦  «         d S r   )rŽ   ÚkillpgÚgetpgidr    s     r   r‘   r‘   $  s"   € Ý
Œ	•"”*˜S‘/”/ ;Ñ/Ô/Ð/Ð/Ð/r   )r’   rq   rk   rq   r   r-   )"r'   Ú
__future__r   r•   r[   ÚloggingrŽ   ru   rW   r|   r“   Úwatchdog.eventsr   r   r   r   Úwatchdog.utilsr   r	   Úwatchdog.utils.event_debouncerr
   Úwatchdog.utils.process_watcherr   Ú	getLoggerr   r   r\   r2   r   r+   r4   ri   Ú
is_windowsr‘   r)   r   r   ú<module>r¬      s  ððð ð2 #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ø Ð Ð Ð Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø Ð Ð Ð Ø €€€à wÐ wÐ wÐ wÐ wÐ wÐ wÐ wÐ wÐ wÐ wÐ wØ )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9à	ˆÔ	˜8Ñ	$Ô	$€ØˆiÔ ¤	Ð1MÐ1MÐNÑNÔN€ðð ð ð ð Ð'ñ ô ð ð,ð ð ð ð �%ñ ô ð ðDjð Djð Djð Djð Dj˜ñ Djô Djð DjðNG ð G ð G ð G ð G �uñ G ô G ð G ðT €8ÔÑÔð 0ð"ð "ð "ð "ð "ð "ð
0ð 0ð 0ð 0ð 0ð 0r   