Ë
    úmxi�D  ã                  óB  — U d Z ddlmZ ddlZddlZddlmZmZmZ ddl	m
Z
mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ erddlmZ ddlmZ  ee«      Zde d<   dd„Z! G d„ d«      Z" G d„ d«      Z# G d„ d«      Z$ G d„ dejJ                  «      Z&y)a  Declares the EventBasedPathWatcher class, which watches given paths in the file system.

How these classes work together
-------------------------------

- EventBasedPathWatcher : each instance of this is able to watch a single
  file or directory at a given path so long as there's a browser interested in
  it. This uses _MultiPathWatcher to watch paths.

- _MultiPathWatcher : singleton that watches multiple paths. It does this by
  holding a watchdog.observer.Observer object, and manages several
  _FolderEventHandler instances. This creates _FolderEventHandlers as needed,
  if the required folder is not already being watched. And it also tells
  existing _FolderEventHandlers which paths it should be watching for.

- _FolderEventHandler : event handler for when a folder is modified. You can
  register paths in that folder that you're interested in. Then this object
  listens to folder events, sees if registered paths changed, and fires
  callbacks if so.

This module is lazy-loaded and used only if watchdog is installed.
é    )ÚannotationsN)ÚTYPE_CHECKINGÚFinalÚcast)ÚANYÚSignal)ÚSelf)Úevents)ÚObserver)ÚStreamlitMaxRetriesError)Ú
get_logger©Úrepr_)Úutil)ÚCallable)ÚObservedWatchr   Ú_LOGGERc                óÄ   — t         j                  j                  t         j                  j                  | «      r| «      S t         j                  j	                  | «      «      S )z¯Get the absolute folder path for a given path.

    If the path is a directory, return the absolute path.
    Otherwise, return the absolute path of the parent directory.
    )ÚosÚpathÚrealpathÚisdirÚdirname)r   s    úa/home/htdocs/ttos/venv/lib/python3.12/site-packages/streamlit/watcher/event_based_path_watcher.pyÚ_get_abs_folder_pathr   >   s=   € ô �7‰7×Ñ¤B§G¡G§M¡M°$Ô$7˜DÓSÐS¼R¿W¹W¿_¹_ÈTÓ=RÓSÐSó    c                  óT   — e Zd ZdZed	d„«       Zdddœ	 	 	 	 	 	 	 	 	 d
d„Zdd„Zd	d„Zy)ÚEventBasedPathWatcherz-Watches a single path on disk using watchdog.c                 óv   — t         j                  «       } | j                  «        t        j	                  d«       y)z&Close the _MultiPathWatcher singleton.zWatcher closedN)Ú_MultiPathWatcherÚget_singletonÚcloser   Údebug)Úpath_watchers    r   Ú	close_allzEventBasedPathWatcher.close_allJ   s+   € ô )×6Ñ6Ó8ˆØ×ÑÔÜ�‰Ð&Õ'r   NF©Úglob_patternÚallow_nonexistentc               ó   — t         j                  j                  |«      | _        || _        t
        j                  «       }|j                  | j                  |||¬«       t        j                  d| j                  «       y)a£  Constructor for EventBasedPathWatchers.

        Parameters
        ----------
        path : str
            The path to watch.
        on_changed : Callable[[str], None]
            Callback to call when the path changes.
        glob_pattern : str or None
            A glob pattern to filter the files in a directory that should be
            watched. Only relevant when creating an EventBasedPathWatcher on a
            directory.
        allow_nonexistent : bool
            If True, the watcher will not raise an exception if the path does
            not exist. This can be used to watch for the creation of a file or
            directory at a given path.
        r&   zWatcher created for %sN)
r   r   r   Ú_pathÚ_on_changedr    r!   Ú
watch_pathr   r#   )Úselfr   Ú
on_changedr'   r(   r$   s         r   Ú__init__zEventBasedPathWatcher.__init__Q   sh   € ô2 —W‘W×%Ñ% dÓ+ˆŒ
Ø%ˆÔä(×6Ñ6Ó8ˆØ×ÑØ�J‰JØØ%Ø/ð	 	 ô 	
ô 	�‰Ð.°·
±
Õ;r   c                ó   — t        | «      S ©Nr   ©r-   s    r   Ú__repr__zEventBasedPathWatcher.__repr__v   ó   € Ü�T‹{Ðr   c                óx   — t         j                  «       }|j                  | j                  | j                  «       y)zCStop watching the path corresponding to this EventBasedPathWatcher.N)r    r!   Ústop_watching_pathr*   r+   )r-   r$   s     r   r"   zEventBasedPathWatcher.closey   s*   € ä(×6Ñ6Ó8ˆØ×'Ñ'¨¯
©
°D×4DÑ4DÕEr   ©ÚreturnÚNone)
r   Ústrr.   úCallable[[str], None]r'   ú
str | Noner(   Úboolr8   r9   ©r8   r:   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodr%   r/   r3   r"   © r   r   r   r   G   s`   „ Ù7àò(ó ð(ð $(Ø"'ñ#<àð#<ð *ð#<ð
 !ð#<ð  ð#<ð 
ó#<óJôFr   r   c                  óˆ   ‡ — e Zd ZU dZdZded<   edd„«       Zdˆ fd„Zdd„Z	dd„Z
dd	d
œ	 	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Zˆ xZS )r    zWatches multiple paths.Nz_MultiPathWatcher | NoneÚ
_singletonc                óŒ   — | j                   €t        j                  d«       t        «        t	        dt        j                   «      S )z_Return the singleton _MultiPathWatcher object.

        Instantiates one if necessary.
        zNo singleton. Registering one.r    )rF   r   r#   r    r   )Úclss    r   r!   z_MultiPathWatcher.get_singleton„   s6   € ð �>‰>Ð!Ü�M‰MÐ:Ô;ÜÔäÐ'Ô):×)EÑ)EÓFÐFr   c                óX   •— t         j                  �t        d«      ‚t        ‰| �  | «      S )úConstructor.zUse .get_singleton() instead)r    rF   ÚRuntimeErrorÚsuperÚ__new__)rH   Ú	__class__s    €r   rM   z_MultiPathWatcher.__new__‘   s*   ø€ ä×'Ñ'Ð3ÜÐ=Ó>Ð>Ü‰w‰˜sÓ#Ð#r   c                ó¬   — | t         _        i | _        t        j                  «       | _        t        «       | _        | j                  j                  «        y)rJ   N)	r    rF   Ú_folder_handlersÚ	threadingÚLockÚ_lockr   Ú	_observerÚstartr2   s    r   r/   z_MultiPathWatcher.__init__—   sB   € à'+ÔÔ$ð ACˆÔô —^‘^Ó%ˆŒ
ô
 "›ˆŒØ�‰×ÑÕr   c                ó   — t        | «      S r1   r   r2   s    r   r3   z_MultiPathWatcher.__repr__§   r4   r   Fr&   c               ó¦  — t        |«      }| j                  5  | j                  j                  |«      }|€=t	        «       }	 | j
                  j                  ||d¬«      |_        || j                  |<   |j                  ||||¬«       ddd«       y# t        $ r*}t        j                  d||¬«       Y d}~ddd«       yd}~ww xY w# 1 sw Y   yxY w)zStart watching a path.NT)Ú	recursivez-Failed to schedule watch observer for path %s©Úexc_infor&   )r   rS   rP   ÚgetÚ_FolderEventHandlerrT   ÚscheduleÚwatchÚ	Exceptionr   ÚwarningÚadd_path_change_listener)r-   r   Úcallbackr'   r(   Úfolder_pathÚfolder_handlerÚexs           r   r,   z_MultiPathWatcher.watch_pathª   së   € ô +¨4Ó0ˆà�Z‰Zñ 	Ø!×2Ñ2×6Ñ6°{ÓCˆNàÐ%Ü!4Ó!6�ðØ+/¯>©>×+BÑ+BØ&¨¸tð ,Có ,�NÔ(ð :H�D×)Ñ)¨+Ñ6ð ×3Ñ3ØØØ)Ø"3ð	 4ô ÷'	ð 	øô !ò Ü—O‘OØGØ#Ø!#ð $ô ó
 ÷#	ð 	ûðú÷	ð 	ús5   ˜(CÁ2BÁ3CÂ	CÂB?Â2CÂ?CÃCÃCc                ó–  — t        |«      }| j                  5  | j                  j                  |«      }|€ t        j                  d|«       	 ddd«       y|j                  ||«       |j                  «       s>|j                  �2| j                  j                  |j                  «       | j                  |= ddd«       y# 1 sw Y   yxY w)zStop watching a path.NzFCannot stop watching path, because it is already not being watched. %s)r   rS   rP   r[   r   r#   Úremove_path_change_listenerÚis_watching_pathsr^   rT   Ú
unschedule)r-   r   rb   rc   rd   s        r   r6   z$_MultiPathWatcher.stop_watching_pathÏ   s¹   € ä*¨4Ó0ˆà�Z‰Zñ 	7Ø!×2Ñ2×6Ñ6°{ÓCˆNàÐ%Ü—‘ð"àôð
 ÷	7ð 	7ð ×6Ñ6°t¸XÔFð #×4Ñ4Ô6Ø"×(Ñ(Ð4à—‘×)Ñ)¨.×*>Ñ*>Ô?Ø×)Ñ)¨+Ð6÷%	7÷ 	7ñ 	7ús   ˜5B?ÁA B?Â?Cc                ó|  — | j                   5  	 t        | j                  «      dk7  r7t        j	                  d«       | j
                  j                  «        i | _        nt        j	                  d«       | j
                  j                  «        | j
                  j                  d¬«       d d d «       y # 1 sw Y   y xY w)Nr   zSStopping observer thread even though there is a non-zero number of event observers!zStopping observer threadé   )Útimeout)	rS   ÚlenrP   r   r#   rT   Úunschedule_allÚstopÚjoinr2   s    r   r"   z_MultiPathWatcher.closeç   s‘   € Ø�Z‰Zñ 	+Ø>ä�4×(Ñ(Ó)¨QÒ.Ü—‘ð1ôð —‘×-Ñ-Ô/Ø(*�Õ%ä—‘Ð8Ô9à�N‰N×ÑÔ!Ø�N‰N×Ñ¨ÐÔ*÷	+÷ 	+ñ 	+ús   �BB2Â2B;)r8   r    )r8   r	   r7   r>   ©
r   r:   rb   r;   r'   r<   r(   r=   r8   r9   ©r   r:   rb   r;   r8   r9   )r?   r@   rA   rB   rF   Ú__annotations__Úclassmethodr!   rM   r/   r3   r,   r6   r"   Ú__classcell__©rN   s   @r   r    r       s|   ø… Ù!à+/€JÐ(Ó/àò	Gó ð	Gõ$óó ð $(Ø"'ñ#àð#ð (ð#ð
 !ð#ð  ð#ð 
ó#óJ7÷0+r   r    c                  ó:   — e Zd ZdZdddœ	 	 	 	 	 	 	 	 	 dd„Zdd„Zy)	ÚWatchedPathz3Emits notifications when a single path is modified.NFr&   c               óZ   — || _         || _        || _        || _        t	        «       | _        y r1   )Úmd5Úmodification_timer'   r(   r   r.   )r-   rz   r{   r'   r(   s        r   r/   zWatchedPath.__init__ü   s,   € ð ˆŒØ!2ˆÔà(ˆÔØ!2ˆÔä ›(ˆ�r   c                ó   — t        | «      S r1   r   r2   s    r   r3   zWatchedPath.__repr__  r4   r   )
rz   r:   r{   Úfloatr'   r<   r(   r=   r8   r9   r>   )r?   r@   rA   rB   r/   r3   rD   r   r   rx   rx   ù   sG   „ Ù=ð $(Ø"'ñ#àð#ð !ð#ð
 !ð#ð  ð#ð 
ó#ô r   rx   c                  óŠ   ‡ — e Zd ZdZdˆ fd„Zdd„Zdddœ	 	 	 	 	 	 	 	 	 dd„Z	 	 	 	 	 	 dd„Zdd	„Zdd
„Z	dd„Z
dd„Zdd„Zˆ xZS )r\   aç  Listen to folder events. If certain paths change, fire a callback.

    The super class, FileSystemEventHandler, listens to changes to *folders*,
    but we need to listen to changes to *both* folders and files. I believe
    this is a limitation of the Mac FSEvents system API, and the watchdog
    library takes the lower common denominator.

    So in this class we watch for folder events and then filter them based
    on whether or not we care for the path the event is about.
    c                óp   •— t         ‰| �  «        i | _        t        j                  «       | _        d | _        y r1   )rL   r/   Ú_watched_pathsrQ   rR   rS   r^   )r-   rN   s    €r   r/   z_FolderEventHandler.__init__  s+   ø€ Ü‰ÑÔØ68ˆÔÜ—^‘^Ó%ˆŒ
Ø+/ˆ�
r   c                ó   — t        | «      S r1   r   r2   s    r   r3   z_FolderEventHandler.__repr__"  r4   r   NFr&   c               óÂ  — | j                   5  | j                  j                  |d«      }|€M	 t        j                  |||¬«      }t        j
                  ||«      }t        ||||¬«      }|| j                  |<   |j                  j                  |d¬«       ddd«       y# t        $ r*}t        j                  d||¬«       Y d}~ddd«       yd}~ww xY w# 1 sw Y   yxY w)z)Add a path to this object's event filter.Nr&   )rz   r{   r'   r(   z#Failed to calculate MD5 for path %srY   F)Úweak)rS   r€   r[   r   Úcalc_md5_with_blocking_retriesÚpath_modification_timerx   r   r   r#   r.   Úconnect)	r-   r   rb   r'   r(   Úwatched_pathrz   r{   re   s	            r   ra   z,_FolderEventHandler.add_path_change_listener%  s  € ð �Z‰Zñ 	BØ×.Ñ.×2Ñ2°4¸Ó>ˆLØÐ#ðÜ×=Ñ=ØØ%1Ø*;ô�Cô
 )-×(CÑ(CØÐ/ó)Ð%ô $/ØØ*;Ø%1Ø*;ô	$�Lð 1=�D×'Ñ'¨Ñ-ð ×#Ñ#×+Ñ+¨H¸5Ð+ÔA÷7	Bð 	Bøô& 0ò Ü—M‘MØ=ØØ!#ð "ô ó
 ÷3	Bð 	Bûð&ú÷'	Bð 	Bús5   �C­ABÁ9CÂ	CÂ(CÃ CÃCÃCÃCc                ó$  — | j                   5  | j                  j                  |d«      }|€
	 ddd«       y|j                  j	                  |«       |j                  j                  t        «      s| j                  |= ddd«       y# 1 sw Y   yxY w)z.Remove a path from this object's event filter.N)rS   r€   r[   r.   Ú
disconnectÚhas_receivers_forr   )r-   r   rb   r‡   s       r   rg   z/_FolderEventHandler.remove_path_change_listenerK  sƒ   € ð �Z‰Zñ 	.Ø×.Ñ.×2Ñ2°4¸Ó>ˆLØÐ#Ø÷	.ð 	.ð
 ×#Ñ#×.Ñ.¨xÔ8Ø×*Ñ*×<Ñ<¼SÔAØ×'Ñ'¨Ð-÷	.÷ 	.ñ 	.ús   � B¶ABÂBc                ó2   — t        | j                  «      dkD  S )z<Return true if this object has 1+ paths in its event filter.r   )rm   r€   r2   s    r   rh   z%_FolderEventHandler.is_watching_pathsX  s   € ä�4×&Ñ&Ó'¨!Ñ+Ð+r   c           	     ó¨  — |j                   t        j                  k(  r|j                  }n¬|j                   t        j                  k(  rDt        d|«      }t        j                  d|j                  |j                  «       |j                  }nK|j                   t        j                  k(  r|j                  }n!t        j                  d|j                   «       yt        |t        «      r|j                  d«      }|j                  d«      rt        j                  d|«       yt        j                  j!                  |«      }| j"                  5  | j$                  j'                  |d«      }|€k| j$                  j)                  «       D ]N  \  }}t        j                  j+                  |«      sŒ&	 t        j                  j-                  ||g«      |k(  r|} nŒP ddd«       €"t        j                  d|| j$                  «       y	 t1        j2                  ||j4                  «      }|d
k7  r&||j6                  k(  rt        j                  d|«       y||_        t1        j8                  ||j:                  |j4                  ¬«      }	|	|j<                  k(  rt        j                  d|«       yt        j                  d|«       |	|_        |j>                  jA                  |«       y# t.        $ r.}t        j                  d|| j$                  |¬	«       Y d}~�Œ�d}~ww xY w# 1 sw Y   �ŒFxY w# tB        $ r"}t        j                  d||¬	«       Y d}~yd}~ww xY w)z£Handle when a path (corresponding to a file or dir) is changed.

        The events that can call this are modification, creation or moved
        events.
        zevents.FileSystemMovedEventzMove event: src %s; dest %szDon't care about event type %sNzutf-8ú~zIgnoring editor backup file: %sz+Ignoring changed path %s.
Watched_paths: %srY   g        z%File/dir timestamp did not change: %sr&   zFile/dir MD5 did not change: %szFile/dir MD5 changed: %sz9Ignoring file change. Failed to calculate MD5 for path %s)"Ú
event_typer
   ÚEVENT_TYPE_MODIFIEDÚsrc_pathÚEVENT_TYPE_MOVEDr   r   r#   Ú	dest_pathÚEVENT_TYPE_CREATEDÚ
isinstanceÚbytesÚdecodeÚendswithr   r   r   rS   r€   r[   Úitemsr   Ú
commonpathÚ
ValueErrorr   r…   r(   r{   r„   r'   rz   r.   Úsendr   )
r-   ÚeventÚchanged_pathÚabs_changed_pathÚchanged_path_infor   Úinfore   r{   Únew_md5s
             r   Úhandle_path_change_eventz,_FolderEventHandler.handle_path_change_event\  sü  € ð ×Ñœv×9Ñ9Ò9Ø Ÿ>™>‰LØ×Ñ¤×!8Ñ!8Ò8ô Ð6¸Ó>ˆEä�M‰MØ-¨u¯~©~¸u¿¹ôð !Ÿ?™?‰Lð ×Ñ¤×!:Ñ!:Ò:Ø Ÿ>™>‰Lä�M‰MÐ:¸E×<LÑ<LÔMØô �l¤EÔ*Ø'×.Ñ.¨wÓ7ˆLà× Ñ  Ô%ä�M‰MÐ;¸\ÔJØäŸ7™7×+Ñ+¨LÓ9Ðð �Z‰Zñ 	!à $× 3Ñ 3× 7Ñ 7Ð8HÈ$Ó OÐð !Ð(Ø"&×"5Ñ"5×";Ñ";Ó"=ò !‘J�D˜$ÜŸ7™7Ÿ=™=¨Ô.Ø ð!ÜŸ7™7×-Ñ-¨tÐ5EÐ.FÓGÈ4ÒOØ04Ð-Ù!ð Pð	!÷	!ð: Ð$Ü�M‰MØ>Ø Ø×#Ñ#ôð
 ð!	Ü $× ;Ñ ;Ø Ð"3×"EÑ"Eó!Ðð " SÒ(Ø%Ð):×)LÑ)LÒLä—‘ÐEÐGWÔXØà2CÐÔ/Ü×9Ñ9Ø Ø.×;Ñ;Ø"3×"EÑ"EôˆGð
 Ð+×/Ñ/Ò/Ü—‘Ð?ÐAQÔRØä�M‰MÐ4Ð6FÔGØ$+ÐÔ!Ø×(Ñ(×-Ñ-Ð.>Õ?øô_ &ò 
!ô  Ÿ™ØJØ,Ø ×/Ñ/Ø%'ð	 &ô õ !ûð
!ú÷!	!ñ 	!ûô@ (ò 	Ü�M‰MØKØ Øð ô ô
 ûð	ús]   ÅALÆ+&KÇLÈA
L& ÉAL& Ê&8L& Ë	LË(#LÌLÌLÌLÌL#Ì&	MÌ/MÍMc                ó&   — | j                  |«       y r1   ©r¢   ©r-   rœ   s     r   Ú
on_createdz_FolderEventHandler.on_createdÎ  ó   € Ø×%Ñ% eÕ,r   c                ó&   — | j                  |«       y r1   r¤   r¥   s     r   Úon_modifiedz_FolderEventHandler.on_modifiedÑ  r§   r   c                ó&   — | j                  |«       y r1   r¤   r¥   s     r   Úon_movedz_FolderEventHandler.on_movedÔ  r§   r   r7   r>   rq   rr   )r8   r=   )rœ   zevents.FileSystemEventr8   r9   )r?   r@   rA   rB   r/   r3   ra   rg   rh   r¢   r¦   r©   r«   ru   rv   s   @r   r\   r\     sŽ   ø„ ñ	õ0óð $(Ø"'ñ$Bàð$Bð (ð$Bð
 !ð$Bð  ð$Bð 
ó$BðL.Øð.Ø#8ð.à	ó.ó,ópód-ó-÷-r   r\   )r   r:   r8   r:   )'rB   Ú
__future__r   r   rQ   Útypingr   r   r   Úblinkerr   r   Útyping_extensionsr	   Úwatchdogr
   Úwatchdog.observersr   Ústreamlit.errorsr   Ústreamlit.loggerr   Ústreamlit.utilr   Ústreamlit.watcherr   Úcollections.abcr   Úwatchdog.observers.apir   r?   r   rs   r   r   r    rx   ÚFileSystemEventHandlerr\   rD   r   r   ú<module>r¹      s‰   ðòõ. #ã 	Û ß -Ñ -ç Ý "Ý Ý 'å 5Ý 'Ý  Ý "áÝ(å4á˜HÓ%€ˆÓ %óT÷5Fñ 5F÷pw+ñ w+÷tñ ô.E-˜&×7Ñ7õ E-r   