
    "e1                         d Z ddlZddlZddlmZ ddlmZ ddlmZ 	 ddl	m
Z
 ddlZd	Zd
ZdZ G d de
      Z G d de      Z G d de      Z G d de      Zy#   G d de      Z
Y FxY w)a~  
Sample usage to track changes in a thread.

    import threading
    import time
    watcher = fsnotify.Watcher()
    watcher.accepted_file_extensions = {'.py', '.pyw'}

    # Configure target values to compute throttling.
    # Note: internal sleep times will be updated based on
    # profiling the actual application runtime to match
    # those values.

    watcher.target_time_for_single_scan = 2.
    watcher.target_time_for_notification = 4.

    watcher.set_tracked_paths([target_dir])

    def start_watching():  # Called from thread
        for change_enum, change_path in watcher.iter_changes():
            if change_enum == fsnotify.Change.added:
                print('Added: ', change_path)
            elif change_enum == fsnotify.Change.modified:
                print('Modified: ', change_path)
            elif change_enum == fsnotify.Change.deleted:
                print('Deleted: ', change_path)

    t = threading.Thread(target=start_watching)
    t.daemon = True
    t.start()

    try:
        ...
    finally:
        watcher.dispose()


Note: changes are only reported for files (added/modified/deleted), not directories.
    N)basename)	pydev_log)scandir)IntEnumc                       e Zd Zy)r   N)__name__
__module____qualname__     A/usr/lib/python3/dist-packages/_pydev_bundle/fsnotify/__init__.pyr   r   2   s    r   r   zFabio Zadroznyzfabiofz@gmail.comz0.1.5c                       e Zd ZdZdZdZy)Change         N)r   r	   r
   addedmodifieddeletedr   r   r   r   r   <   s    EHGr   r   c                       e Zd Zd Zy)_SingleVisitInfoc                 p    d| _         t               | _        i | _        t	        j                         | _        y Nr   )countsetvisited_dirsfile_to_mtimetimelast_sleep_timeselfs    r   __init__z_SingleVisitInfo.__init__D   s)    
E#yy{r   N)r   r	   r
   r"   r   r   r   r   r   B   s    +r   r   c                   6    e Zd ZdZd	dZd Zd Zd Zd Zd Z	y)
_PathWatcherz(
    Helper to watch a single path.
    c                     || _         || _        || _        || _        || _        d| _        i }| j                  |d |       y)z
        :type root_path: str
        :type accept_directory: Callback[str, bool]
        :type accept_file: Callback[str, bool]
        :type max_recursion_level: int
        :type sleep_time: float
        g?c                      y Nr   )_changes    r   <lambda>z'_PathWatcher.__init__.<locals>.<lambda>f   s    r   N)accept_directoryaccept_file_max_recursion_level
_root_path
sleep_timesleep_at_elapsed_check)r!   	root_pathr*   r+   single_visit_infomax_recursion_levelr.   old_file_to_mtimes           r   r"   z_PathWatcher.__init__P   sO     !1&$7!# % ( %';=NOr   c                 V    t        |t              r| j                  |j                  k(  S y)NF)
isinstancer$   r-   r!   os     r   __eq__z_PathWatcher.__eq__h   s"    a&??all22r   c                     | |k(   S r'   r   r7   s     r   __ne__z_PathWatcher.__ne__n   s    19}r   c                 ,    t        | j                        S r'   )hashr-   r    s    r   __hash__z_PathWatcher.__hash__q   s    DOO$$r   c           	         ||j                   v s|| j                  kD  ry |j                   j                  |       	 t        |t              r$	 |j                  t        j                               }|j                  }t        |      D ]  }|xj                  dz  c_        |j                  dz  dk(  ry| j                  dkD  rjt        j                         }||j                  z
  }	|	| j                  kD  r8t        j                   | j                         t        j                         |_        |j#                         r?| j%                  |j&                        s| j)                  |j&                  ||||dz          | j+                  |j&                        s|j-                         }
|
j.                  |
j0                  f}|j&                  }|||<   |j3                  |d       }|s |t4        j6                  |f       w||k7  s~ |t4        j8                  |f        y # t        $ r' 	 |j                  d      }n# t        $ r Y Y y w xY wY w xY w# t:        $ r Y y w xY w)Nzutf-8r   i,  r   )r   r,   addr6   bytesdecodesysgetfilesystemencodingUnicodeDecodeErrorr   r   r   r.   r   r   r/   sleepis_dirr*   path
_check_dirr+   statst_mtime_nsst_sizepopr   r   r   OSError)r!   dir_pathr2   append_changer4   level	new_filesentrytdiffrJ   mtimerH   	old_mtimes                 r   rI   z_PathWatcher._check_dirt   s	   (555AZAZ9Z&&**84*	(E*'s/H/H/JKH *77I * ?!''1,' %**S0A5* IIK #4#D#DD$"7"77 JJt7@D		-=<<>,,UZZ8

4E}Vginqrirs%%ejj1 ::<D!--t||<E ::D&+IdO 1 5 5dD AI$%v||T&:;"e+%v&=>7? * #+??7#;-  !J  		ss   I #H  /C&I >I A,I I  	I*H<;I<	I	II I		II II 	IIc                 B    | j                  | j                  |||d       y r   )rI   r-   )r!   r2   rP   r4   s       r   r0   z_PathWatcher._check   s    ):MK\^_`r   N)        )
r   r	   r
   __doc__r"   r9   r;   r>   rI   r0   r   r   r   r$   r$   K   s(    P0%/bar   r$   c                       e Zd Zh dZdZdZdZdZdZddZ	e
d	        Zej                  d
        Ze
d        Zej                  d        Zd Ze
d        Zd Zd Zy)Watcher>   .git.idea	.metadata__pycache__node_modulesr          @g      @F
   Nc                      t                _        t        j                          _        | fd}| fd}| _        | _        t                _        y)a  
        :param Callable[str, bool] accept_directory:
            Callable that returns whether a directory should be watched.
            Note: if passed it'll override the `ignored_dirs`

        :param Callable[str, bool] accept_file:
            Callable that returns whether a file should be watched.
            Note: if passed it'll override the `accepted_file_extensions`.
        Nc                 2    t        |       j                  vS r'   )r   ignored_dirs)rO   r!   s    r   r)   z"Watcher.__init__.<locals>.<lambda>   s    0B$J[J[0[ r   c                 X    j                    xs | j                  j                         S r'   )accepted_file_extensionsendswith)	path_namer!   s    r   r)   z"Watcher.__init__.<locals>.<lambda>   s*    111fY5G5GHeHe5f r   )	r   _path_watchers	threadingEvent	_disposedr+   r*   r   _single_visit_info)r!   r*   r+   s   `  r   r"   zWatcher.__init__   sR     "e"*#[gK& 0"2"4r   c                     | j                   S r'   )_accept_directoryr    s    r   r*   zWatcher.accept_directory   s    %%%r   c                 B    || _         | j                  D ]	  }||_         y r'   )rq   rk   r*   )r!   r*   path_watchers      r   r*   zWatcher.accept_directory   s'    !1 // 	=L,<L)	=r   c                     | j                   S r'   )_accept_filer    s    r   r+   zWatcher.accept_file   s       r   c                 B    || _         | j                  D ]	  }||_         y r'   )ru   rk   r+   )r!   r+   rs   s      r   r+   zWatcher.accept_file   s'    ' // 	3L'2L$	3r   c                 8    | j                   j                          y r'   )rn   r   r    s    r   disposezWatcher.dispose   s    r   c                 ,    t        | j                        S r'   )tuplerk   r    s    r   path_watcherszWatcher.path_watchers   s    T(())r   c           	         t        |t        t        t        f      s|f}t	        t        |      d       }t               }t               | _        t        j                         }|D ]N  }d}t        || j                  | j                  | j                  | j                  |      }|j                  |       P t        j                         |z
  }t        j                  d|       t        j                  d|       t        j                  dt        | j                  j                                t        j                  dt        | j                  j"                               || _        y	)
zR
        Note: always resets all path trackers to track the passed paths.
        c                     t        |        S r'   )len)rH   s    r   r)   z+Watcher.set_tracked_paths.<locals>.<lambda>   s    CI: r   )keyrY   )r3   r.   z,Tracking the following paths for changes: %szTime to track: %.2fszFolders found: %szFiles found: %sN)r6   listrz   r   sortedr   ro   r   r$   r*   r+   r3   r@   r   debugr~   r   r   rk   )r!   pathsr{   initial_timerH   r.   rs   actual_times           r   set_tracked_pathszWatcher.set_tracked_paths   s    %$s!34HE
 s5z'=>"2"4yy{ 	,DJ'%%  ''$($<$<%L l+	, yy{\1FN.<+S1H1H1U1U-VW)3t/F/F/T/T+UV+r   c              #   X  K   | j                   j                         st        j                         }| j                  }|j                  }g }|j
                  }t               x| _        }| j                  D ]  }|j                  |||        |D ]  } |t        j                  |f        |D ]  }	|	  t        j                         |z
  }
| j                  rt        d|
z         |
dkD  r| j                  dk  r| j                  D ]	  }d|_         n| j                  |
z  }|dkD  rd}n|dk  rd}| j                  D ]  }|j                  dk  rd|_        |j                  |z  }||j                  z
  }|xj                  |dt        | j                        z  z  z  c_        |
dkD  r| j                   j!                  |
       |j                  dk  sd|_         | j"                  |
z
  }|dkD  r| j                   j!                  |       | j                   j                         s
yyw)	z
        Continuously provides changes (until dispose() is called).

        Changes provided are tuples with the Change enum and filesystem path.

        :rtype: Iterable[Tuple[Change, str]]
        z--- Total poll time: %.3fsr   rY   rb   g      ?gMbP?g      @N)rn   is_setr   ro   r   appendr   rk   r0   r   r   print_poll_timeprinttarget_time_for_single_scanr.   r~   waittarget_time_for_notification)r!   r   old_visit_infor4   changesrP   r2   rs   rS   changer   percnew_sleep_timediff_sleep_timerU   s                  r   iter_changeszWatcher.iter_changes  s'     ..'')99;L!44N . < <G#NNM:J:LLD#&7 $ 3 3 Y##$5}FWXY + 7v~~u567 "   99;5K##2[@AQ33s:(,(;(; 625/6  ;;kID by!"(,(;(; <'22c96;L3)5)@)@4)G +9<;R;R*R$//OsSQUQdQdMeGe4fg/&? NN//<'22U:6;L3!<( 44{BDby##D){ ..''))s   GH*AH*(H*)NN)r   r	   r
   rf   rh   r   r   r   r3   r"   propertyr*   setterr+   rx   r{   r   r   r   r   r   r\   r\      s     VL  " #& $'  O 5, & & = =
 ! ! 3 3
 * *#,JE*r   r\   )rZ   rl   rC   os.pathr   _pydev_bundler   osr   enumr   objectr   
__author__	__email____version__r   r   r$   r\   r   r   r   <module>r      s   &N  
  #  
	W +v +[a6 [a|w*f w*s& s   A A*