ó
    ÏÐbgŒ  ã                   ó®   • S r SSKrSSKrSSKrSSKrSSKJr   SSKr\R                  " S5      r
 " S S5      r " S S\5      rS	 rg! \ a    Sr N5f = f)
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                   ót   • \ rS rSrSrS rS rS rS rSS jr	S	 r
S
 rSS jrS rSS jrSS jrSS jrSrg)ÚWatcheré   zA file watcher registry.c                 ó�   • 0 U l         0 U l        0 U l        / U l        S U l        [
        R
                  " 5       U l        / SQU l        g )N)z.gitz.hgz.svnz.cvs)Ú_tasksÚ_task_mtimesÚ_new_mtimesÚ_changesÚfilepathÚtimeÚ_startÚignored_dirs©Úselfs    Ú4/usr/lib/python3/dist-packages/livereload/watcher.pyÚ__init__ÚWatcher.__init__   sD   € ØˆŒð ˆÔØˆÔð ˆŒð ˆŒÜ—i’i“kˆŒò <ˆÕó    c                 ó:   • U R                   R                  U5        g ©N)r   Úextend)r   Úargss     r   Úignore_dirsÚWatcher.ignore_dirs-   s   € Ø×Ñ× Ñ  Õ&r   c                 óL   • U H  nU R                   R                  U5        M      g r   )r   Úremove)r   r   Úas      r   Úremove_dirs_from_ignoreÚWatcher.remove_dirs_from_ignore0   s    € ÛˆAØ×Ñ×$Ñ$ QÖ'ò r   c                 óN   • [         R                  R                  U5      u  p#US;   $ )zIgnore a given filename or not.)z.pycz.pyoz.oz.swp)ÚosÚpathÚsplitext)r   ÚfilenameÚ_Úexts       r   ÚignoreÚWatcher.ignore4   s$   € ä—‘×!Ñ! (Ó+‰ˆØÐ4Ñ4Ð4r   Nc                 ó,   • UUU0 S.U R                   U'   g)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   ÚwatchÚWatcher.watch9   s    € ð ØØØñ	
ˆ�‰�DÒr   c                 ó   • g)z{Start the watcher running, calling callback when changes are
observed. If this returns False, regular polling will be used.F© )r   Úcallbacks     r   ÚstartÚWatcher.startK   s   € ð r   c                 óÞ  • U R                   (       a  U R                   R                  5       $ SU l        [        5       nU R                   Hÿ  nU R                  U   nUS   U l        U R                  X#S   5      nU(       d  M9  US   nUS   nU(       a&  [        U[        5      (       a  UR                  U5        U(       d  My  [        USS5      nU(       d  [        USS5      n[        R                  S	U S
U S35        [        [        U5      R                  5      S:”  a  [        U[         5      (       a
  U" U5        M÷  U" 5         GM     U(       a  [#        U5      nOSnU R                  U4$ )zoCheck 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-   r7   s           r   ÚexamineÚWatcher.examineP   s/  € ð
 �=�=Ø—=‘=×$Ñ$Ó&Ð&ð ˆŒÜ“ˆØ—K”KˆDØ—;‘;˜tÑ$ˆDØ $ X¡ˆDÔØ—o‘o d°©NÓ;ˆGßˆwØ˜F‘|�Ø˜W™�ÞœZ¨¬u×5Ñ5Ø—J‘J˜uÔ%ß�4Ü" 4¨°Ó6�DÞÜ& t¨Z¸ÓE˜Ü—K‘KØ(¨¨¨i¸°w¸aÐ@ôBäœ9 T›?×5Ñ5Ó6¸Ó:¼zÈ'ÔSW×?XÑ?XÙ˜WžáŸñ%  ö( Ü˜“K‰EàˆEØ�}‰}˜eÐ#Ð#r   c                 óŠ  • 0 U l         Sn[        R                  R                  U5      (       a  U R	                  X5      nOG[        R                  R                  U5      (       a  U R                  X5      nOU R                  X5      nU(       d  U R                  5       nU R                  R                  U R                   5        U$ )zyCheck 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)   rJ   s       r   r=   ÚWatcher.is_changedu   s—   € ð
 ˆÔØˆä�7‰7�>‰>˜$×ÑØ×*Ñ*¨4Ó8‰GÜ�W‰W�]‰]˜4× Ñ Ø×,Ñ,¨TÓ:‰Gà×1Ñ1°$Ó?ˆGæØ×*Ñ*Ó,ˆGà×Ñ× Ñ  ×!1Ñ!1Ô2Øˆr   c                 ó¾   • [        U R                  5      [        U R                  5      -
  nU(       d  gU H$  nU R                  R                  U5        X l        M&     g)zšCheck 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)r<   r
   r   r;   r   )r   Úremoved_pathsr$   s      r   rS   ÚWatcher.is_file_removedŠ   sT   € ô ˜D×-Ñ-Ó.´°T×5EÑ5EÓ1FÑFˆÞØã!ˆDØ×Ñ×!Ñ! $Ô'ð !ŽMñ	 "ð
 r   c                 ó²  • [         R                  R                  U5      (       d  gU R                  U5      (       a  gU(       a  U" U5      (       a  g[         R                  R	                  U5      nXR
                  ;  a"  X0R                  U'   Xl        X0R                  :„  $ U R
                  U   U:w  a  X0R                  U'   Xl        gX0R                  U'   g)z�Check 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$   rN   r)   Úgetmtimer
   r   r   r   )r   r$   r)   Úmtimes       r   rO   ÚWatcher.is_file_changed›   s´   € ô �w‰w�~‰~˜d×#Ñ#Øà�;‰;�t×ÑØæ‘f˜T—l‘lØä—‘× Ñ  Ó&ˆà×(Ñ(Ó(Ø%*×Ñ˜TÑ"Ø ŒMØŸ;™;Ñ&Ð&à×Ñ˜TÑ" eÓ+Ø%*×Ñ˜TÑ"Ø ŒMØà!&×Ñ˜ÑØr   c                 ó  • [         R                  " USS9 Hq  u  p4nU R                   H  nXd;   d  M
  UR                  U5        M     U H:  nU R	                  [         R
                  R                  X75      U5      (       d  M9      g   Ms     g)z2Check if directory path has any changed filepaths.T)ÚfollowlinksF)r#   Úwalkr   r   rO   r$   Újoin)r   r$   r)   ÚrootÚdirsÚfilesÚdÚfs           r   rQ   ÚWatcher.is_folder_changed¹   sq   € ä!#§¢¨¸4Ô!@ÑˆD˜Ø×&Ô&�Ø•9Ø—K‘K –Nñ 'ó �Ø×'Ñ'¬¯©¯©°TÓ(=¸v×FÓFÚó ñ "Að r   c                 óŒ   • [         R                   " USS9nU Vs/ s H  o@R                  XB5      (       d  M  UPM     nnU$ s  snf )z-Check if glob path has any changed filepaths.T)Ú	recursive)ÚglobrO   )r   r$   r)   rc   re   Úchanged_filess         r   rR   ÚWatcher.get_changed_glob_filesÅ   s=   € ä—	’	˜$¨$Ñ/ˆÙ$)ÓM¢E˜q×-AÑ-AÀ!×-LŸ¡EˆÐMØÐùò Ns
   šA·A)r   r   r   r
   r	   r   r   )Nr   Nr   )r8   Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r   r    r)   r/   r4   rK   r=   rS   rO   rQ   rR   Ú__static_attributes__r2   r   r   r   r      sB   † Ù"ò<ò$'ò(ò5ô

ò$ò
#$ôJò*ô"ô<
÷r   r   c                   ó0   • \ rS rSrS rSS jrS rS rSrg)	ÚINotifyWatcheréÌ   c                 ó~   • [         R                  U 5        [        R                  " 5       U l        S U l        S U l        g r   )r   r   Ú	pyinotifyÚWatchManagerÚwmÚnotifierr3   r   s    r   r   ÚINotifyWatcher.__init__Í   s.   € Ü×Ñ˜Ôä×(Ò(Ó*ˆŒØˆŒØˆ�r   Nc                 óÎ   • [         R                  [         R                  -  [         R                  -  nU R                  R                  XSSSS9  [        R                  XX#U5        g )NT)ÚrecÚdo_globÚauto_add)ru   Ú	IN_CREATEÚ	IN_DELETEÚ	IN_MODIFYrw   Ú	add_watchr   r/   )r   r$   r,   r-   r)   Úflags         r   r/   ÚINotifyWatcher.watchÔ   sN   € Ü×"Ñ"¤Y×%8Ñ%8Ñ8¼9×;NÑ;NÑNˆØ�‰×Ñ˜$¨$¸ÀtÐÑLÜ�‰�d $¨vÕ6r   c                 ó$   • U R                  5         g r   )r3   )r   Úevents     r   Úinotify_eventÚINotifyWatcher.inotify_eventÙ   s   € Ø�‰�r   c                 óÚ   • U R                   (       dZ  Xl        SSKJn  [        R
                  " U R                  UR                  R                  5       U R                  S9U l         U" 5         g)Nr   )Úioloop)Údefault_proc_funT)
rx   r3   Útornador‰   ru   ÚTornadoAsyncNotifierrw   ÚIOLoopÚinstancer†   )r   r3   r‰   s      r   r4   ÚINotifyWatcher.startÜ   sL   € Ø�}�}Ø$ŒMå&Ü%×:Ò:Ø—‘˜Ÿ™×/Ñ/Ó1Ø!%×!3Ñ!3ñˆDŒMñ ŒJØr   )r3   rx   rw   )NNN)	r8   rl   rm   rn   r   r/   r†   r4   rp   r2   r   r   rr   rr   Ì   s   † òô7ò
õ
r   rr   c                  óR   • [         b  [        [         S5      (       d  [        $ [        $ )NrŒ   )ru   Úhasattrr   rr   r2   r   r   Úget_watcher_classr’   é   s    € ÜÑ¤¬	Ð3I× JÑ JÜˆÜÐr   )ro   ri   Úloggingr#   r   Úinspectr   ru   ÚImportErrorÚ	getLoggerrB   r   rr   r’   r2   r   r   Ú<module>r—      sj   ðñó Û Û 	Û Ý ðÛð 
×	Ò	˜<Ó	(€÷pñ pôf�Wô ó:øðm ó Ø‚Iðús   šA	 Á	AÁA