o
    h%                     @  s  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eZejejdd	 d
ZG dd deZG dd deZG dd deZG dd deZe  rdddZ!dS d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                 C  s
   t | S N)loggerinfo)msg r   L/var/www/vscode/kcb/lib/python3.10/site-packages/watchdog/tricks/__init__.py<lambda>+   s   
 r   )writec                   @  s(   e Zd ZdZd	ddZed	ddZdS )
Trickz'Your tricks should subclass this class.returnstrc                 C  s   dt | j dS )N<>)type__name__selfr   r   r   __repr__1   s   zTrick.__repr__c                 C  s   d| j  d| j dS )Nz- .z:
  args:
  - argument1
  - argument2
  kwargs:
    patterns:
    - "*.py"
    - "*.js"
    ignore_patterns:
    - "version.py"
    ignore_directories: false
)
__module__r   )clsr   r   r   generate_yaml4   s   zTrick.generate_yamlN)r   r   )r   r   __qualname____doc__r   classmethodr    r   r   r   r   r   .   s
    
r   c                   @  s   e Zd ZdZed	ddZdS )
LoggerTrickz*A simple trick that does only logs events.eventr   r   Nonec                 C  s   d S r   r   r   r%   r   r   r   on_any_eventG   s   zLoggerTrick.on_any_eventNr%   r   r   r&   )r   r   r!   r"   echo_eventsr(   r   r   r   r   r$   D   s    r$   c                      sD   e Zd ZdZddddddd fddZdddZdddZ  ZS )ShellCommandTrickz6Executes shell commands in response to matched events.NF)patternsignore_patternsignore_directorieswait_for_processdrop_during_processshell_commandr   r,   list[str] | Noner-   r.   boolr/   r0   c                  s6   t  j|||d || _|| _|| _d | _t | _d S )Nr,   r-   r.   )super__init__r1   r/   r0   processset_process_watchers)r   r1   r,   r-   r.   r/   r0   	__class__r   r   r6   O   s   
zShellCommandTrick.__init__r%   r   r   r&   c                 C  s  |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	d u r=t
|dr:|j|d< d}nd	}nt
|drG|j|d
< | j	}||jdi |}tj|dd| _| jrf| j  d S t| jd }| j| t| 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}"rA   T)shellr   )
event_typer   r   stringr<   r0   is_process_runningis_directorysrc_pathr1   hasattrrD   safe_substitute
subprocessPopenr7   r/   waitr
   r9   add	functoolspartialdiscardprocess_termination_callbackstart)r   r%   r<   object_typecontextcommandprocess_watcherr   r   r   r(   e   s<   




zShellCommandTrick.on_any_eventc                 C  s"   t | jp| jd uo| j d u S r   )r3   r9   r7   pollr   r   r   r   rH      s   "z$ShellCommandTrick.is_process_running)r1   r   r,   r2   r-   r2   r.   r3   r/   r3   r0   r3   r)   )r   r3   )r   r   r!   r"   r6   r(   rH   __classcell__r   r   r:   r   r+   L   s    
*r+   c                      sv   e Zd ZdZdddejddddd' fddZd(ddZd(ddZd(ddZ	d(dd Z
ed)d#d$Zd(d%d&Z  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)r,   r-   r.   stop_signal
kill_afterdebounce_interval_secondsrestart_on_command_exitrX   	list[str]r,   r2   r-   r.   r3   r^   signal.Signals | intr_   intr`   ra   c          
        s   |dk r
d}	t |	|dk rd}	t |	t j|||d || _t|tjr)|jn|| _|| _	|| _
|| _d | _d | _d | _d| _d| _d| _t | _d S )Nr   z kill_after must be non-negative.z/debounce_interval_seconds must be non-negative.r4   F)
ValueErrorr5   r6   rX   
isinstancesignalSignalsvaluer^   r_   r`   ra   r7   rY   event_debouncerrestart_count_is_process_stopping_is_trick_stopping	threadingRLock_stopping_lock)
r   rX   r,   r-   r.   r^   r_   r`   ra   errorr:   r   r   r6      s.   zAutoRestartTrick.__init__r   r&   c                   s4    j rt j  fddd _ j     d S )Nc                   s      S r   )_restart_process)eventsr   r   r   r      s    z(AutoRestartTrick.start.<locals>.<lambda>)r`   events_callback)r`   r	   rj   rU   _start_processr   r   r   r   rU      s   

zAutoRestartTrick.startc                 C  s   | j  | jr	 W d    d S d| _W d    n1 sw   Y  | j}| jd ur/| j  |   | jd ur=| j  |d urG|  d S d S )NT)rp   rm   rY   rj   stop_stop_processjoin)r   rY   r   r   r   rv      s   



zAutoRestartTrick.stopc                 C  sL   | j rd S tj| jttdd d| _| jr$t| j| j	| _
| j
  d S d S )Nsetsid)
preexec_fn)rm   rM   rN   rX   getattrosr7   ra   r
   rr   rY   rU   r   r   r   r   ru      s   zAutoRestartTrick._start_processc                 C  s0  | j  | jr	 W d    d S d| _W d    n1 sw   Y  zq| jd ur0| j  d | _| jd urz
t| jj| j W n	 tyH   Y n=w t		 | j
 }t		 |k ri| j d ur^n't	d t		 |k sVtt t| jjd W d    n1 sw   Y  d | _W d| _d S W d| _d S d| _w )NTg      ?	   F)rp   rl   rY   rv   r7   kill_processpidr^   OSErrortimer_   rZ   sleep
contextlibsuppress)r   	kill_timer   r   r   rw      s:   




zAutoRestartTrick._stop_processr%   r   c                 C  s8   |j tthv r	d S | jd ur| j| d S |   d S r   )rF   r   r   rj   handle_eventrr   r'   r   r   r   r(   
  s
   
zAutoRestartTrick.on_any_eventc                 C  s,   | j rd S |   |   |  jd7  _d S )N   )rm   rw   ru   rk   r   r   r   r   rr     s
   z!AutoRestartTrick._restart_process)rX   rb   r,   r2   r-   r2   r.   r3   r^   rc   r_   rd   r`   rd   ra   r3   )r   r&   r)   )r   r   r!   r"   rg   SIGINTr6   rU   rv   ru   rw   r*   r(   rr   r[   r   r   r:   r   r\      s"    
(
	


 
r\   r   rd   r^   r   r&   c                 C  s   t | | d S r   )r|   killr   r^   r   r   r   r~     s   r~   c                 C  s   t t | | d S r   )r|   killpggetpgidr   r   r   r   r~   $  s   )r   rd   r^   rd   r   r&   )"r"   
__future__r   r   rQ   loggingr|   rg   rM   rn   r   watchdog.eventsr   r   r   r   watchdog.utilsr   r   watchdog.utils.event_debouncerr	   watchdog.utils.process_watcherr
   	getLoggerr   r   rR   r*   r   r$   r+   r\   
is_windowsr~   r   r   r   r   <module>   s0    
G 