
    "d@&                       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 ddl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:                  j=                  d      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PatternMatchingEventHandler)echo)EventDebouncer)ProcessWatcherc                ,    t         j                  |       S N)loggerinfo)msgs    :/usr/lib/python3/dist-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_yamlB   s'    cnn%Qs||n 5  	r   N)r   r   __qualname____doc__classmethodr    r   r   r   r   >   s    1 r   r   c                  v    e Zd ZdZd Zed        Zed        Zed        Zed        Z	ed        Z
e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_eventV   s    r   c                     y r
   r   r!   s     r   on_modifiedzLoggerTrick.on_modifiedY       r   c                     y r
   r   r!   s     r   
on_deletedzLoggerTrick.on_deleted]   r'   r   c                     y r
   r   r!   s     r   
on_createdzLoggerTrick.on_createda   r'   r   c                     y r
   r   r!   s     r   on_movedzLoggerTrick.on_movede   r'   r   c                     y r
   r   r!   s     r   	on_closedzLoggerTrick.on_closedi   r'   r   c                     y r
   r   r!   s     r   	on_openedzLoggerTrick.on_openedm   r'   r   N)r   r   r   r   r$   echo_eventsr&   r)   r+   r-   r/   r1   r   r   r   r   r   R   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"   r<   r7   r8   r9   r=   r>   	__class__s          r   r;   zShellCommandTrick.__init__v   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}"rI   T)shellr   )
event_typer   stringrD   r>   is_process_runningis_directorysrc_pathr<   hasattrrL   safe_substitute
subprocessPopenr?   r=   waitr   rA   add	functoolspartialdiscardprocess_termination_callbackstart)r"   r#   rD   object_typecontextcommandprocess_watchers          r   r$   zShellCommandTrick.on_any_event   sK   00###(?(?(A%*%7%7kV#nn! % 0 0'	
 %uk*',$sXuk*-2__)*((G3(7#33>g>!''t<  LL,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
   )rA   r?   pollr"   s    r   rP   z$ShellCommandTrick.is_process_running   s8    %% 
LL$D):):)<)D	
r   )NNNFFF)r   r   r   r   r;   r$   rP   __classcell__rB   s   @r   r4   r4   r   s*    @  !'*'$R
r   r4   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.r6   F)
ValueErrorr:   r;   r`   stop_signal
kill_afterdebounce_interval_secondsrestart_on_command_exitr?   ra   event_debouncerrestart_count_is_process_stopping_is_trick_stopping	threadingRLock_stopping_lock)
r"   r`   r7   r8   r9   rl   rm   rn   ro   rB   s
            r   r;   zAutoRestartTrick.__init__   s     >?@@$q(NOO+1 	 	
 &$)B&'>$##$)!"''oo/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   )rn   events_callback)rn   r   rp   r]   _start_processrd   s   `r   r]   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)rv   rs   ra   rp   stop_stop_processjoin)r"   ra   s     r   r~   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)rs   rU   rV   r`   getattrosr?   ro   r   ry   ra   r]   rd   s    r   r|   zAutoRestartTrick._start_process  so    "" "''LLWR4%@
 ''#1$,,@U@U#VD   &&( (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                         nNt        j                  d       t        j                         |k  rH	 t        | j                  j                  d       d | _        d| _        y # 1 sw Y   xY w# t        $ r Y 'w xY w# t        $ r Y 6w xY w# d| _        w xY w)NTg      ?	   F)rv   rr   ra   r~   r?   kill_processpidrl   timerm   rc   sleepOSError)r"   	kill_times     r   r   zAutoRestartTrick._stop_process  sE      	-((	- 	- )-D%	-
	.##/$$))+'+$||'! !1!143C3CD
 !%		doo =I))+	1<<,,.:!

4( ))+	1
!()9)91=  $(-D%=	- 	-2  ' ! !  " ).D%sd   EE9E3 .*E$ A?E3  E 9E3 E	E!E3  E!!E3 $	E0-E3 /E00E3 3	E<c                    |j                   t        k(  ry | j                  | j                  j                  |       y | j	                          y r
   )rN   r   rp   handle_eventry   r!   s     r   r$   zAutoRestartTrick.on_any_event3  s@    00+  --e4!!#r   c                    | j                   ry | j                          | j                          | xj                  dz  c_        y )N   )rs   r   r|   rq   rd   s    r   ry   z!AutoRestartTrick._restart_process>  s7    ""ar   )r   r   r   r   signalSIGINTr;   r]   r~   r|   r   r2   r$   ry   re   rf   s   @r   rh   rh      sW      MM"# $#0J#$
) .D $ $ r   rh   winc                V    t        j                  t        j                  |       |       y r
   )r   killpggetpgidr   rl   s     r   r   r   H  s    
		"**S/;/r   c                0    t        j                  | |       y r
   )r   killr   s     r   r   r   M  s    
[!r   ) r   
__future__r   rY   loggingr   r   rU   sysrt   r   watchdog.eventsr   r   watchdog.utilsr   watchdog.utils.event_debouncerr   watchdog.utils.process_watcherr   	getLoggerr   r   rZ   r2   r   r   r4   rh   platform
startswithr   r   r   r   <module>r      s    4 #   	   
   J  9 9			8	$i		1MN' (% @E
 E
PI u I X ||u%0
"r   