
    O&i                         d Z ddlZddlZddlZddlZddlmZ 	 ddlZn# e$ r dZY nw xY w ej	        d          Z
 G d d          Z G d de          Zd	 ZdS )
z
    livereload.watcher
    ~~~~~~~~~~~~~~~~~~

    A file watch management for LiveReload Server.

    :copyright: (c) 2013 - 2015 by Hsiaoming Yang
    :license: BSD, see LICENSE for more details.
    N)	signature
livereloadc                   d    e Zd ZdZd Zd Zd Zd ZddZd	 Z	d
 Z
ddZd ZddZddZddZdS )WatcherzA file watcher registry.c                     i | _         i | _        i | _        g | _        d | _        t          j                    | _        g d| _        d S )N)z.gitz.hgz.svnz.cvs)_tasks_task_mtimes_new_mtimes_changesfilepathtime_startignored_dirsselfs    _/home/geonatureadmin/si_en_reseau/tutos/venv/lib/python3.11/site-packages/livereload/watcher.py__init__zWatcher.__init__   sP       ikk <;;    c                 :    | j                             |           d S N)r   extend)r   argss     r   ignore_dirszWatcher.ignore_dirs-   s      &&&&&r   c                 D    |D ]}| j                             |           d S r   )r   remove)r   r   as      r   remove_dirs_from_ignorezWatcher.remove_dirs_from_ignore0   s5     	( 	(A$$Q''''	( 	(r   c                 N    t           j                            |          \  }}|dv S )zIgnore a given filename or not.)z.pycz.pyoz.oz.swp)ospathsplitext)r   filename_exts       r   ignorezWatcher.ignore4   s'    !!(++3444r   Nr   c                 $    |||i d| j         |<   dS )a  Add a task to watcher.

        :param path: a filepath or directory path or glob pattern
        :param func: the function to be executed when file changed
        :param delay: Delay sending the reload message. Use 'forever' to
                      not send it. This is useful to compile sass files to
                      css, but reload on changed css files then only.
        :param ignore: A function return True to ignore a certain pattern of
                       filepath.
        )funcdelayr%   mtimesN)r   )r   r    r'   r(   r%   s        r   watchzWatcher.watch9   s)     	
 
Dr   c                     dS )zStart the watcher running, calling callback when changes are
        observed. If this returns False, regular polling will be used.F )r   callbacks     r   startzWatcher.startK   s	     ur   c                    | j         r| j                                         S d| _        t                      }| j        D ]}| j        |         }|d         | _        |                     ||d                   }|r|d         }|d         }|r*t          |t                    r|	                    |           |rt          |dd          }|st          |dd          }t                              d	| d
| d           t          t          |          j                  dk    r"t          |t                     r ||            |             |rt#          |          }nd}| j        |fS )zCheck if there are changes. If so, run the given task.

        Returns a tuple of modified filepath and reload delay.
        Nr)   r%   r'   r(   name__name__	anonymouszRunning task: z	 (delay: )r   )r   popr   setr   r	   
is_changed
isinstancefloataddgetattrloggerinfolenr   
parameterslistmax)r   delaysr    itemchangedr'   r(   r0   s           r   examinezWatcher.examineP   s   
 = 	'=$$&&& K 	 	D;t$D $XDoodDN;;G F|W &Zu55 &JJu%%% 	"466D F&tZEEKK@@@@@@B B B9T??566::z'SW?X?X:W 	KKEEE}e##r   c                    i | _         d}t          j                            |          r|                     ||          }nLt          j                            |          r|                     ||          }n|                     ||          }|s|                                 }| j	        
                    | j                    |S )zCheck if any filepaths have been added, modified, or removed.

        Updates filepath modification times in self._task_mtimes.
        F)r
   r   r    isfileis_file_changedisdiris_folder_changedget_changed_glob_filesis_file_removedr	   update)r   r    r%   rC   s       r   r6   zWatcher.is_changedu   s    
 7>>$ 	@**488GGW]]4   	@,,T6::GG11$??G 	-**,,G  !1222r   c                     t          | j                  t          | j                  z
  }|sdS |D ]#}| j                            |           || _        $dS )zCheck if any filepaths have been removed since last check.

        Deletes removed paths from self._task_mtimes.
        Sets self.filepath to one of the removed paths.
        FT)r5   r	   r
   r4   r   )r   removed_pathsr    s      r   rK   zWatcher.is_file_removed   sg     D-..T5E1F1FF 	5! 	! 	!D!!$''' !DMMtr   c                 x   t           j                            |          sdS |                     |          rdS |r ||          rdS t           j                            |          }|| j        vr|| j        |<   || _        || j        k    S | j        |         |k    r|| j        |<   || _        dS || j        |<   dS )zCheck if filepath has been added or modified since last check.

        Updates filepath modification times in self._new_mtimes.
        Sets self.filepath to changed path.
        FT)	r   r    rF   r%   getmtimer	   r
   r   r   )r   r    r%   mtimes       r   rG   zWatcher.is_file_changed   s     w~~d## 	5;;t 	5 	ffTll 	5  &&t(((%*DT" DM4;&&T"e++%*DT" DM4!&ur   c                     t          j        |d          D ]f\  }}}| j        D ]}||v r|                    |           |D ]:}|                     t           j                            ||          |          r  dS ;gdS )z2Check if directory path has any changed filepaths.T)followlinksF)r   walkr   r   rG   r    join)r   r    r%   rootdirsfilesdfs           r   rI   zWatcher.is_folder_changed   s    !#4!@!@!@ 	  	 D$& # #99KKNNN    ''T1(=(=vFF  444   ur   c                 T     t          j         |d          } fd|D             }|S )z-Check if glob path has any changed filepaths.T)	recursivec                 @    g | ]}                     |          |S r,   )rG   ).0rZ   r%   r   s     r   
<listcomp>z2Watcher.get_changed_glob_files.<locals>.<listcomp>   s.    MMMqT-A-A!V-L-LMMMMr   )glob)r   r    r%   rX   changed_filess   ` `  r   rJ   zWatcher.get_changed_glob_files   s:    	$$///MMMMMEMMMr   )Nr   Nr   )r1   
__module____qualname____doc__r   r   r   r%   r*   r.   rD   r6   rK   rG   rI   rJ   r,   r   r   r   r      s        ""< < <$' ' '( ( (5 5 5

 
 
 
$  
#$ #$ #$J   *  "   <
 
 
 
     r   r   c                   (    e Zd Zd ZddZd Zd ZdS )INotifyWatcherc                     t                               |            t          j                    | _        d | _        d | _        d S r   )r   r   	pyinotifyWatchManagerwmnotifierr-   r   s    r   r   zINotifyWatcher.__init__   s8    (**r   Nc                     t           j        t           j        z  t           j        z  }| j                            ||ddd           t                              | ||||           d S )NT)recdo_globauto_add)rh   	IN_CREATE	IN_DELETE	IN_MODIFYrj   	add_watchr   r*   )r   r    r'   r(   r%   flags         r   r*   zINotifyWatcher.watch   s[    "Y%889;NN$$tLLLdD$v66666r   c                 .    |                                   d S r   )r-   )r   events     r   inotify_eventzINotifyWatcher.inotify_event   s    r   c                     | j         sT|| _        ddlm} t	          j        | j        |j                                        | j	                  | _          |             dS )Nr   )ioloop)default_proc_funT)
rk   r-   tornadory   rh   TornadoAsyncNotifierrj   IOLoopinstancerw   )r   r-   ry   s      r   r.   zINotifyWatcher.start   sk    } 	$DM&&&&&&%://11!%!3  DM HJJJtr   )NNN)r1   rb   rc   r   r*   rw   r.   r,   r   r   rf   rf      sU          7 7 7 7
  
 
 
 
 
r   rf   c                  V    t           t          t           d          st          S t          S )Nr|   )rh   hasattrr   rf   r,   r   r   get_watcher_classr      s#    	3I J Jr   )rd   r`   loggingr   r   inspectr   rh   ImportError	getLoggerr;   r   rf   r   r,   r   r   <module>r      s      				          III 
	<	(	(p p p p p p p pf    W   :    s    ))