Ë
    úmxiÞ,  ã                  ó   — U d dl mZ d dlZd dlZd dlmZ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mZmZ erd dlmZ d d	lmZ d d
lmZ  ee«      Zded<    G d„ de«      Zdaded<    G d„ d«      Zdd„Z dd„Z!y)é    )ÚannotationsN)ÚTYPE_CHECKINGÚAnyÚFinalÚ
NamedTuple)ÚconfigÚ	file_util)Ú
get_logger)ÚFolderBlackList)ÚNoOpPathWatcherÚPathWatcherTypeÚget_default_path_watcher_class)ÚCallable)Ú
ModuleType)ÚPagesManagerr   Ú_LOGGERc                  ó"   — e Zd ZU ded<   ded<   y)ÚWatchedModuler   Úwatcherú
str | NoneÚmodule_nameN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    ú^/home/htdocs/ttos/venv/lib/python3.12/site-packages/streamlit/watcher/local_sources_watcher.pyr   r   '   s   … ØƒLØÔr   r   zPathWatcherType | NoneÚPathWatcherc                  ó‚   — e Zd ZdZdd„Zdd„Zdd„Zdd„Zdd„Z	 d	 	 	 	 	 	 	 dd„Z	dd„Z
dd	„Zdd
„Zdd„Zdd„Zdd„Zy)ÚLocalSourcesWatcheraK  Watch local Python sources and pages to trigger app reruns.

    Purpose
    -------
    This watcher powers Streamlit's core developer workflow: save a Python file
    and the app reruns. It tracks Python modules, the main script directory, and
    configured watch folders to notify the runtime when a relevant file changes.
    c                óÞ  — || _         t        j                  j                  | j                   j                  «      | _        t        j                  d«      | _        t        j                  j                  | j
                  «      | _
        g | _        d| _        t        «       | _        t        t        j                  d«      «      | _        i | _        t        «       | _        | j'                  «        y )Nzserver.folderWatchListFzserver.folderWatchBlacklist)Ú_pages_managerÚosÚpathÚrealpathÚmain_script_pathÚ_main_script_pathr   Ú
get_optionÚ_watch_foldersÚdirnameÚ_script_folderÚ_on_path_changedÚ
_is_closedÚsetÚ_cached_sys_modulesr   Ú_folder_black_listÚ_watched_modulesÚ_watched_pagesÚupdate_watched_pages)ÚselfÚpages_managers     r   Ú__init__zLocalSourcesWatcher.__init__;   s³   € Ø+ˆÔÜ!#§¡×!1Ñ!1°$×2EÑ2E×2VÑ2VÓ!WˆÔÜ$×/Ñ/Ð0HÓIˆÔÜ Ÿg™gŸo™o¨d×.DÑ.DÓEˆÔØ=?ˆÔØˆŒÜ-0«UˆÔ ô #2Ü×ÑÐ;Ó<ó#
ˆÔð ;=ˆÔÜ(+«ˆÔà×!Ñ!Õ#r   c                óŠ  — | j                   j                  «       }t        «       }| j                  j	                  «       j                  «       D ]]  }|d   sŒ	t        j                  j                  |d   «      }|j                  |«       || j                   vsŒK| j                  |d ¬«       Œ_ | j                  D ]�  }t        j                  j                  |«      st        j                  d|«       Œ9t        j                  d|«       t        j                  j                  |«      }|| j                   vsŒ}| j                  |d d¬«       Œ’ |D ]S  }||vsŒt        j                  j!                  |«      rŒ(| j#                  |«       | j                   j%                  |«       ŒU | j                   j'                  |«      | _         y )NÚscript_path)r   z#Watch folder is not a directory: %szRegistering watch folder: %sT)r   Úis_directory)r3   Úcopyr/   r#   Ú	get_pagesÚvaluesr$   r%   r&   ÚaddÚ_register_watcherr*   Úisdirr   ÚwarningÚdebugÚisfileÚ_deregister_watcherÚremoveÚunion)r5   Úold_page_pathsÚnew_pages_pathsÚ	page_infoÚ	page_pathÚwatch_folderÚwatch_folder_pathÚold_page_paths           r   r4   z(LocalSourcesWatcher.update_watched_pagesN   sŽ  € Ø×,Ñ,×1Ñ1Ó3ˆÜ$'£Eˆà×,Ñ,×6Ñ6Ó8×?Ñ?ÓAò 
	ˆIØ˜]Ò+ØäŸ™×(Ñ(¨°=Ñ)AÓBˆIØ×Ñ 	Ô*Ø × 3Ñ 3Ò3Ø×&Ñ&ØØ $ð 'õ ð
	ð !×/Ñ/ò 	ˆLä—7‘7—=‘= Ô.Ü—‘Ð EÀ|ÔTØÜ�M‰MÐ8¸,ÔGÜ "§¡× 0Ñ 0°Ó >ÐØ ¨×(;Ñ(;Ò;Ø×&Ñ&Ø%Ø $Ø!%ð 'õ ð	ð ,ò 	:ˆMà OÒ3¼B¿G¹G¿N¹NØõ=ð ×(Ñ(¨Ô7Ø×#Ñ#×*Ñ*¨=Õ9ð	:ð #×1Ñ1×7Ñ7¸ÓHˆÕr   c                ó:   — | j                   j                  |«       y ©N)r-   Úappend)r5   Úcbs     r   Úregister_file_change_callbackz1LocalSourcesWatcher.register_file_change_callbackx   s   € Ø×Ñ×$Ñ$ RÕ(r   c                ó¾  — t         j                  d|«       t        j                  j	                  |«      }|| j
                  vr�| j
                  D ]w  }t        j                  j                  |«      sŒ#t        j                  j                  ||g«      |k(  sŒHt         j                  d|«       | j                  D ]
  } ||«       Œ  y  t         j                  d|«       y | j
                  j                  «       D ]G  }|j                  €Œ|j                  t        j                  v sŒ-t        j                  |j                  = ŒI | j                  D ]
  } ||«       Œ y )NzPath changed: %sz%File changed in watched directory: %sz'Received event for non-watched path: %s)r   rB   r$   r%   r&   r2   r@   Ú
commonpathr-   Úerrorr=   r   ÚsysÚmodules)r5   ÚfilepathÚnorm_filepathÚwatched_pathrQ   Úwms         r   Úon_path_changedz#LocalSourcesWatcher.on_path_changed{   s"  € Ü�‰Ð(¨(Ô3äŸ™×(Ñ(¨Ó2ˆØ × 5Ñ 5Ñ5à $× 5Ñ 5ò 	�ä—G‘G—M‘M ,Õ/ÜŸ™×*Ñ*¨L¸-Ð+HÓIØ#ó$ô —M‘MÐ"IÈ8ÔTØ"×3Ñ3ò %˜Ù˜8�ð%áð	ô �M‰MÐCÀXÔNØð ×'Ñ'×.Ñ.Ó0ò 	0ˆBØ�~‰~Ñ)¨b¯n©nÄÇÁÒ.KÜ—K‘K §¡Ñ/ð	0ð ×'Ñ'ò 	ˆBÙˆx�Lñ	r   c                ó°   — | j                   j                  «       D ]  }|j                  j                  «        Œ i | _         t	        «       | _        d| _        y )NT)r2   r=   r   Úcloser/   r3   r.   )r5   r[   s     r   r^   zLocalSourcesWatcher.close¡   sI   € Ø×'Ñ'×.Ñ.Ó0ò 	ˆBØ�J‰J×ÑÕð	à "ˆÔÜ!›eˆÔØˆ�r   c                ó  — t         €
t        «       a t         t        u ry 	 |rdnd }t        t        || j                  |d¬«      |¬«      }|| j
                  |<   y # t        $ r"}t        j                  d||¬«       Y d }~y d }~ww xY w)Nz**/*F)Úglob_patternÚallow_nonexistent)r   r   zFailed to watch file %s: %s©Úexc_info)	r   r   r   r   r\   r2   Ú	Exceptionr   rA   )r5   rX   r   r:   r`   r[   Úexs          r   r?   z%LocalSourcesWatcher._register_watcher¨   sŽ   € ô ÐÜ8Ó:ˆKäœ/Ñ)Øð	á%1™6°tˆLäÜ#ØØ×(Ñ(Ø!-Ø&+ô	ð (ôˆBð /1ˆD×!Ñ! (Ò+øÜò 	ô �O‰OÐ9¸8ÈbˆOÔQÜûð		ús   Ÿ9A Á	BÁ"A?Á?Bc                ó®   — || j                   vry || j                  k(  ry | j                   |   }|j                  j                  «        | j                   |= y rO   )r2   r(   r   r^   )r5   rX   r[   s      r   rD   z'LocalSourcesWatcher._deregister_watcherÆ   sR   € Ø˜4×0Ñ0Ñ0Øà�t×-Ñ-Ò-Øà×"Ñ" 8Ñ,ˆØ
�
‰
×ÑÔØ×!Ñ! (Ñ+r   c                ó   — || j                   vS rO   )r2   ©r5   rX   s     r   Ú_file_is_newz LocalSourcesWatcher._file_is_newÑ   s   € Ø˜t×4Ñ4Ð4Ð4r   c                ó–   — | j                  |«      xr7 t        j                  || j                  «      xs t        j                  |«      S rO   )ri   r	   Úfile_is_in_folder_globr,   Úfile_in_pythonpathrh   s     r   Ú_file_should_be_watchedz+LocalSourcesWatcher._file_should_be_watchedÔ   sC   € à× Ñ  Ó*ò 
Ü×,Ñ,¨X°t×7JÑ7JÓKò 6Ü×+Ñ+¨HÓ5ð	
r   c           
     óz  — | j                   ry t        t        j                  «      | j                  k7  r‚t        t        j                  «      j                  «       D ��ci c]   \  }}|| j                  t        |«      «      “Œ" }}}t        t        j                  «      | _        | j                  |«       y y c c}}w rO   )
r.   r/   rV   rW   r0   ÚdictÚitemsÚ_exclude_blacklisted_pathsÚget_module_pathsÚ_register_necessary_watchers)r5   ÚnameÚmoduleÚmodules_pathss       r   Úupdate_watched_modulesz*LocalSourcesWatcher.update_watched_modulesÛ   s™   € Ø�?Š?ØäŒs�{‰{Ó˜t×7Ñ7Ò7ô %)¬¯©Ó$5×$;Ñ$;Ó$=÷á �D˜&ð �d×5Ñ5Ô6FÀvÓ6NÓOÑOðˆMñ ô (+¬3¯;©;Ó'7ˆDÔ$Ø×-Ñ-¨mÕ<ð 8ùós   Á%B7c                óÄ   — |j                  «       D ]M  \  }}|D ]C  }| j                  |«      sŒ| j                  t        j                  j                  |«      |«       ŒE ŒO y rO   )rp   rm   r?   r$   r%   r&   )r5   Úmodule_pathsrt   Úpathsr%   s        r   rs   z0LocalSourcesWatcher._register_necessary_watchersç   s^   € Ø'×-Ñ-Ó/ò 	I‰KˆD�%Øò I�Ø×/Ñ/°Õ5Ø×*Ñ*¬2¯7©7×+;Ñ+;¸DÓ+AÀ4ÕHñIñ	Ir   c                ód   — |D �ch c]   }| j                   j                  |«      rŒ|’Œ" c}S c c}w rO   )r1   Úis_blacklisted)r5   rz   Úps      r   rq   z.LocalSourcesWatcher._exclude_blacklisted_pathsí   s)   € Ø ÖR�a¨×(?Ñ(?×(NÑ(NÈqÕ(Q’ÒRÐRùÒRs   … -¦-N)r6   r   ÚreturnÚNone)r~   r   )rQ   zCallable[[str], None]r~   r   )rX   Ústrr~   r   )F)rX   r€   r   r   r:   Úboolr~   r   )rX   r€   r~   r�   )ry   zdict[str, set[str]]r~   r   )rz   úset[str]r~   r‚   )r   r   r   Ú__doc__r7   r4   rR   r\   r^   r?   rD   ri   rm   rw   rs   rq   r   r   r   r!   r!   1   so   „ ñó$ó&(IóT)ó$óLð LQðØðØ*4ðØDHðà	óó<	,ó5ó
ó
=óIôSr   r!   c                óp  — d„ d„ d„ g}t        «       }|D ]^  }g }	  || «      }|j                  |D �cg c]6  }t        |«      sŒt        j                  j                  t        |«      «      ‘Œ8 c}«       Œ` |S # t        $ r Y Œ`t        $ r% t        j	                  d| j
                  d¬«       Y ŒŒw xY wc c}w )Nc                ó8   — t        | d«      r| j                  gS g S )NÚ__file__)Úhasattrr†   ©Úms    r   ú<lambda>z"get_module_paths.<locals>.<lambda>÷   s   € ¤'¨!¨ZÔ"8�1—:‘:�,€ ¸b€ r   c                ód   — t        | d«      r#| j                  �| j                  j                  gS g S )NÚ__spec__)r‡   rŒ   Úoriginrˆ   s    r   rŠ   z"get_module_paths.<locals>.<lambda>  s1   € Ü�1�jÔ! a§j¡jÐ&<ð —:‘:×$Ñ$Ð%€ àð r   c                óÌ   — t        | d«      rWt        | j                  «      j                  dk(  r5t        | j                  d«      rt	        | j                  j
                  «      S g S )NÚ__path__Ú_NamespacePathÚ_path)r‡   Útyper�   r   Úlistr‘   rˆ   s    r   rŠ   z"get_module_paths.<locals>.<lambda>  sT   € Ü�1�jÔ!ô �—‘Ó×%Ñ%Ð)9Ò9Ü�A—J‘J Ô(ô �q—z‘z×'Ñ'Ó(€ ð ð r   z Examining the path of %s raised:Trb   )r/   ÚAttributeErrorrd   r   rA   r   ÚupdateÚ_is_valid_pathr$   r%   r&   r€   )ru   Úpaths_extractorsÚ	all_pathsÚextract_pathsÚpotential_pathsr}   s         r   rr   rr   ñ   sÅ   € ñ 	Añ	ñ	ð-HÐô> “€IØ)ò 
ˆØˆð	Ù+¨FÓ3ˆOð 	×ÑØ/>ÖT¨!Ä.ÐQRÕBSŒR�W‰W×Ñœc !›fÕ%ÒTõ	
ð
ð Ðøô ò 	áÜò 	Ü�O‰OØ2°F·O±OÈdð ö ð	üò Us"   ›A8²B3
Á*B3
Á8	B0Â*B0Â/B0c                ó¦   — t        | t        «      xr@ t        j                  j	                  | «      xs t        j                  j                  | «      S rO   )Ú
isinstancer€   r$   r%   rC   r@   )r%   s    r   r–   r–   $  s3   € Ü�dœCÓ ÒR¤b§g¡g§n¡n°TÓ&:Ò&Q¼b¿g¹g¿m¹mÈDÓ>QÐRr   )ru   r   r~   r‚   )r%   r   r~   r�   )"Ú
__future__r   r$   rV   Útypingr   r   r   r   Ú	streamlitr   r	   Ústreamlit.loggerr
   Ú#streamlit.watcher.folder_black_listr   Ústreamlit.watcher.path_watcherr   r   r   Úcollections.abcr   Útypesr   Ústreamlit.runtime.pages_managerr   r   r   r   r   r   r!   rr   r–   r   r   r   ú<module>r¦      sz   ðö #ã 	Û 
ß 8Ó 8ç 'Ý 'Ý ?÷ñ ñ Ý(Ý å<á˜HÓ%€ˆÓ %ô�Jô ð '+€Ð#Ó *÷}Sñ }Só@0ôfSr   