a
    0hE<                     @  s  U d dl mZ d dlZd dlZd dl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mZ ddlmZ eejejhZh eejejZeedreej eeZ[h dZd	d
ddZddddddZddddddZddddddZdddddZdd
ddZ G dd dZ!G d d! d!e!Z"G d"d# d#e!Z#e"e#d$Z$d%e%d&< ze&d' W n  e'y   e$d( e$d)< Y n0 e$d* e$d)< dd
d+d,Z(d4d-d.d.d/d0dd1d2d3Z)dS )5    )annotationsN)chain)PurePath   )_logreal_prefix>   z.pytest_cache__pycache__z.mypy_cachez.gitz.hgz.toxz.noxzt.Iterator[str]returnc                  c  sf   t tj D ]R} t| dd}|du s|tr2qtj	|sZ|}tj
|}||kr2qq2|V  qdS )z;Find the filesystem paths associated with imported modules.__file__N)listsysmodulesvaluesgetattr
startswith_ignore_alwaysospathisfiledirname)modulenameold r   @/var/www/auris/lib/python3.9/site-packages/werkzeug/_reloader.py_iter_module_paths(   s    r   zset[str]None)pathsexclude_patternsr
   c                 C  s    |D ]}|  t| | qd S N)difference_updatefnmatchfilter)r   r   patternr   r   r   _remove_by_pattern<   s    r%   zt.Iterable[str])extra_filesr   r
   c           
   	   C  s   t  }tttj| D ]}tj|}tj|r>|| qtj	|di}t
|D ]\}}}|ts|tj|tv r|  qXd}|D ]&}	|	drd}|tj||	 q|s|tj	| s|  qX|||< qXq|t  t|| |S )ax  Find paths for the stat reloader to watch. Returns imported
    module files, Python files under non-system paths. Extra files and
    Python files under extra directories can also be scanned.

    System paths have to be excluded for efficiency. Non-system paths,
    such as a project root or ``sys.path.insert``, should be the paths
    of interest to the user anyway.
    TF)z.pyz.pyc)setr   r   r   r   r   abspathr   addr   walkr   _stat_ignore_scanbasename_ignore_common_dirsclearendswithjoinupdater   r%   )
r&   r   r   r   Zparent_has_pyrootdirsfilesZhas_pyr   r   r   r   _find_stat_pathsA   s4    


r5   c                 C  sz   t  }tttj| D ]2}tj|}tj|r>tj|}|	| qt
 D ]}|	tj| qPt|| t|S )zFind paths for the stat reloader to watch. Looks at the same
    sources as the stat reloader, but watches everything under
    directories instead of individual files.
    )r'   r   r   r   r   r   r(   r   r   r)   r   r%   _find_common_roots)r&   r   r3   r   r   r   r   _find_watchdog_pathsw   s    

r7   )r   r
   c                   sp   i }t dd | D tddD ]&}|}|D ]}||i }q(|  qt dddd fd	d
  |d S )Nc                 s  s   | ]}t |jV  qd S r    )r   parts.0xr   r   r   	<genexpr>       z%_find_common_roots.<locals>.<genexpr>T)keyreversez t.Mapping[str, dict[str, t.Any]]ztuple[str, ...]r   )noder   r
   c                   s@   |   D ]\}} |||f  q| s<|r<tjj|  d S r    )itemsr)   r   r   r0   )r@   r   prefixchild_walkrvr   r   rE      s    z!_find_common_roots.<locals>._walkr   )sortedlen
setdefaultr.   r'   )r   r2   chunksr@   chunkr   rD   r   r6      s    
	
r6   z	list[str]c                  C  s  t jdkr t jgt jdd S t jg} t jd }t jdd }t jd }t|dddu stjdkr|j	dkrtj
|stj
| d	rtj
|}tjdkr
tj
|stj
| d	r|d	7 }tj
t jd d	kr
tj
|d d	kr
| d | | nftj
|rdtt|j	}tj
tj
|d }|dkrh|d
| 7 }n|}| d|d
f | | | S )zpDetermine how the script was executed, and return the args needed
    to execute it again in a new process.
    )   
   r   Nr   __main____package__nt z.exe.z-m)r   version_info
executableZ	orig_argvargvr   r   r   r   rO   r   existsr(   splitextpopappendr   tcaststrr,   extendlstrip)rF   Z	py_scriptargsrN   Z	py_moduler   r   r   r   _get_args_for_reloading   sD    






r`   c                   @  s   e Zd ZdZdddddddd	Zd d
ddZdd Zdd
ddZdd
ddZdd
ddZ	dddddZ
dddddZdS )ReloaderLooprQ   Nr   t.Iterable[str] | Noneint | floatr   )r&   r   intervalr
   c                 C  s,   dd |pdD | _ t|pd| _|| _d S )Nc                 S  s   h | ]}t j|qS r   )r   r   r(   r9   r   r   r   	<setcomp>   r=   z(ReloaderLoop.__init__.<locals>.<setcomp>r   )r&   r'   r   rd   )selfr&   r   rd   r   r   r   __init__   s    zReloaderLoop.__init__r	   c                 C  s   |    | S )zgDo any setup, then run one step of the watch to populate the
        initial filesystem state.
        )run_steprf   r   r   r   	__enter__   s    zReloaderLoop.__enter__c                 C  s   dS )z4Clean up any resources associated with the reloader.Nr   rf   exc_typeexc_valexc_tbr   r   r   __exit__   s    zReloaderLoop.__exit__c                 C  s   |    t| j q dS )zfContinually run the watch step, sleeping for the configured
        interval after each step.
        N)rh   timesleeprd   ri   r   r   r   run   s    zReloaderLoop.runc                 C  s   dS )z}Run one step for watching the filesystem. Called once to set
        up initial state, then repeatedly to update it.
        Nr   ri   r   r   r   rh     s    zReloaderLoop.run_stepintc                 C  sL   t dd| j  t }tj }d|d< tj||dd}|dkr |S q dS )	z|Spawn a new Python interpreter with the same arguments as the
        current one, but running the reloader thread.
        infoz * Restarting with trueWERKZEUG_RUN_MAINF)env	close_fdsrL   N)r   r   r`   r   environcopy
subprocesscall)rf   r_   Znew_environZ	exit_coder   r   r   restart_with_reloader
  s    
z"ReloaderLoop.restart_with_reloaderr\   filenamer
   c                 C  s   |  | td d S NrL   )
log_reloadr   exitrf   r   r   r   r   trigger_reload  s    
zReloaderLoop.trigger_reloadstr | bytesc                 C  s"   t j|}tdd|d d S )Nrt   z * Detected change in z, reloading)r   r   r(   r   r   r   r   r   r     s    zReloaderLoop.log_reload)NNr   )__name__
__module____qualname__r   rg   rj   ro   rr   rh   r}   r   r   r   r   r   r   ra      s      
ra   c                      s4   e Zd ZdZdd fddZddddZ  ZS )	StatReloaderLoopstatra   r	   c                   s   i | _ t  S r    )mtimessuperrj   ri   	__class__r   r   rj   $  s    zStatReloaderLoop.__enter__r   c              	   C  sr   t | j| jD ]^}zt|j}W n ty8   Y qY n0 | j|}|d u rZ|| j|< q||kr| 	| qd S r    )
r5   r&   r   r   r   st_mtimeOSErrorr   getr   )rf   r   mtimeZold_timer   r   r   rh   (  s    

zStatReloaderLoop.run_step)r   r   r   r   rj   rh   __classcell__r   r   r   r   r   !  s   r   c                      sl   e Zd Zdddd fddZddddd	Zd
d fddZdd ZddddZddddZ  Z	S )WatchdogReloaderLoopzt.Anyr   )r_   kwargsr
   c                   s  ddl m  ddl m ddl m ddl m ddl m ddl m ddl m} dd	lm	} t
 j|i | | jG  fd
dd|}|j }|dr|d d }d| d| _| | _dd | jD }|dddg|g dd tD | jd| _d| _d S )Nr   )EVENT_TYPE_CLOSED)EVENT_TYPE_CREATED)EVENT_TYPE_DELETED)EVENT_TYPE_MODIFIED)EVENT_TYPE_MOVED)FileModifiedEvent)PatternMatchingEventHandler)Observerc                      s(   e Zd Zdd fddZdS )z3WatchdogReloaderLoop.__init__.<locals>.EventHandlerr   )eventc                   s&   |j  hvrd S |j d S r    )Z
event_typeZsrc_path)rf   r   )r   r   r   r   r   r   r   r   on_any_eventH  s    z@WatchdogReloaderLoop.__init__.<locals>.EventHandler.on_any_eventN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   EventHandlerG  s   r   observeriz
watchdog ()c                 S  s   g | ]}t j|s|qS r   )r   r   isdir)r:   pr   r   r   
<listcomp>a  r=   z1WatchdogReloaderLoop.__init__.<locals>.<listcomp>z*.pyz*.pycz*.zipc                 S  s   g | ]}d | dqS )z*/z/*r   )r:   dr   r   r   r   e  r=   )patternsignore_patternsF)Zwatchdog.eventsr   r   r   r   r   r   r   Zwatchdog.observersr   r   rg   r   r   lowerr/   r   r   r&   r-   r   event_handlershould_reload)rf   r_   r   r   r   r   Zreloader_nameZextra_patternsr   r   r   rg   :  s4     

zWatchdogReloaderLoop.__init__r   r~   c                 C  s   d| _ | | d S )NT)r   r   r   r   r   r   r   k  s    z#WatchdogReloaderLoop.trigger_reloadra   r	   c                   s   i | _ | j  t  S r    )watchesr   startr   rj   ri   r   r   r   rj   r  s    
zWatchdogReloaderLoop.__enter__c                 C  s   | j   | j   d S r    )r   stopr0   rk   r   r   r   ro   w  s    
zWatchdogReloaderLoop.__exit__c                 C  s*   | j s|   t| j q td d S r   )r   rh   rp   rq   rd   r   r   ri   r   r   r   rr   {  s    zWatchdogReloaderLoop.runc              	   C  s   t | j}t| j| jD ]T}|| jvrbz| jj| j|dd| j|< W n ty`   d | j|< Y n0 |	| q|D ]&}| j
|d }|d urr| j| qrd S )NT)	recursive)r'   r   r7   r&   r   r   Zscheduler   r   discardrX   Z
unschedule)rf   Z	to_deleter   Zwatchr   r   r   rh     s    

zWatchdogReloaderLoop.run_step)
r   r   r   rg   r   rj   ro   rr   rh   r   r   r   r   r   r   9  s   1r   )r   watchdogzdict[str, type[ReloaderLoop]]reloader_loopszwatchdog.observersr   autor   c                  C  s|   t jdu st j sdS zddl} W n ty8   Y dS 0 | t j}|d | j@ sx|d  | jO  < | t j| j| dS )zuEnsure that echo mode is enabled. Some tools such as PDB disable
    it which causes usability issues after a reload.Nr   rL   )	r   stdinisattytermiosImportError	tcgetattrECHO	tcsetattrTCSANOW)r   
attributesr   r   r   ensure_echo_on  s    r   zt.Callable[[], None]rb   rc   r\   )	main_funcr&   r   rd   reloader_typer
   c                 C  s   ddl }| |jdd  t| |||d}zrtjddkrt  tj| dd	}d
|_	|  |
  |  W d   q1 s0    Y  nt|  W n ty   Y n0 dS )z<Run the given function in an independent Python interpreter.r   Nc                  W  s
   t dS )Nr   )r   r   )r_   r   r   r   <lambda>  r=   z#run_with_reloader.<locals>.<lambda>)r&   r   rd   rv   ru   r   )targetr_   T)signalSIGTERMr   r   ry   r   r   	threadingThreaddaemonr   rr   r   r   r}   KeyboardInterrupt)r   r&   r   rd   r   r   ZreloaderrZ   r   r   r   run_with_reloader  s     (r   )NNr   r   )*
__future__r   r"   r   r{   r   r   rp   typingrZ   	itertoolsr   pathlibr   	_internalr   tuplebase_prefixbase_exec_prefixr   rB   exec_prefixhasattrr)   r   r+   r-   r   r%   r5   r7   r6   r`   ra   r   r   r   __annotations__
__import__r   r   r   r   r   r   r   <module>   sP   
6;=b    