a
    -=ic7                     @   s6  U 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eje dd	d
Zeje eje ddddZeje eje eje dddZeje eje eje dddZ eje eje dddZ!ej"e 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'ej(eej)e$ f 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-d)ej.g df ej/eje  ej/eje  ej0e1e2f edd&d'd(Z3dS )*    N)chain)PurePath   )_logreal_prefix>   z.mypy_cachez.noxz.toxz.hg__pycache__z.pytest_cachez.git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   c/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/werkzeug/_reloader.py_iter_module_paths&   s    r   )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#   )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_paths?   s4    


r3   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   r1   r   r   r   r   _find_watchdog_pathsu   s    

r5   )r   r	   c                    s   i }t dd | D tddD ]&}|}|D ]}||i }q(|  qt tjttf tj	tdf 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reverse.)noder   r	   c                    s<   |   D ]\}} |||f  q| s8tjj|  d S r   )itemsr'   r   r   r.   )r>   r   prefixchild_walkrvr   r   rC      s    z!_find_common_roots.<locals>._walkr   )
sortedlen
setdefaultr,   r%   tMappingstrdictTuple)r   r0   chunksr>   chunkr   rB   r   r4      s    
,
r4   c                  C   s\  t jg} t jd }t jdd }t jd }t|dddu sltjdkr|jdkrtj	|stj	| drtj
|}tjdkrtj	|stj	| dr|d7 }tjt jd dkrtj|d dkr| d | | nftj|r6tt|j}tjtj|d }|dkr:|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   r   N__main____package__nt z.exe.z-m)r   
executableargvr   r   r   r   rP   r   existsr&   splitextpopappendr   rH   castrJ   r*   extendlstrip)rD   Z	py_scriptargsrO   	py_moduler   r   r   r   _get_args_for_reloading   s@    






r_   c                   @   s   e Zd ZdZdejeje  ejeje  eje	e
f ddddZd ddd	Zd
d ZddddZddddZe	dddZeddddZeddddZdS )ReloaderLooprR   Nr   )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&   r7   r   r   r   	<setcomp>   r;   z(ReloaderLoop.__init__.<locals>.<setcomp>r   )r$   r%   r   ra   )selfr$   r   ra   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rc   r   r   r   	__enter__   s    zReloaderLoop.__enter__c                 C   s   dS )z4Clean up any resources associated with the reloader.Nr   rc   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)re   timesleepra   rf   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   rf   r   r   r   re      s    zReloaderLoop.run_stepc                 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_fds   N)r   r   r_   r   environcopy
subprocesscall)rc   r]   Znew_environ	exit_coder   r   r   restart_with_reloader  s    
z"ReloaderLoop.restart_with_reloaderfilenamer	   c                 C   s   |  | td d S Nru   )
log_reloadr   exitrc   r}   r   r   r   trigger_reload  s    
zReloaderLoop.trigger_reloadc                 C   s"   t j|}tdd|d d S )Nrp   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   rH   OptionalIterablerJ   Unionintfloatrd   rg   rl   ro   re   r{   r   r   r   r   r   r   r`      s"      
r`   c                       s4   e Zd ZdZed fddZddddZ  ZS )StatReloaderLoopstatr   c                    s   i | _ t  S r   )mtimessuperrg   rf   	__class__r   r   rg     s    zStatReloaderLoop.__enter__Nc              	   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   )
r3   r$   r   r   r   st_mtimeOSErrorr   getr   )rc   r   mtimeZold_timer   r   r   re     s    

zStatReloaderLoop.run_step)r   r   r   r   r`   rg   re   __classcell__r   r   r   r   r     s   r   c                       sp   e Zd Zejejdd fddZeddddZed fd	d
Z	dd Z
ddddZddddZ  ZS )WatchdogReloaderLoopN)r]   kwargsr	   c                    s   ddl m} ddlm} t j|i | | j G  fddd|}|j }|	drd|d d }d| d	| _
| | _d
d | jD }|dddg|g dd tD | jd| _d| _d S )Nr   )Observer)PatternMatchingEventHandlerc                       s   e Zd Z fddZdS )z3WatchdogReloaderLoop.__init__.<locals>.EventHandlerc                    s    |j  d S r   )Zsrc_path)rc   eventr   r   r   on_any_event9  s    z@WatchdogReloaderLoop.__init__.<locals>.EventHandler.on_any_eventN)r   r   r   r   r   r   r   r   EventHandler8  s   r   observeriz
watchdog ()c                 S   s   g | ]}t j|s|qS r   )r   r   isdir)r8   pr   r   r   
<listcomp>H  r;   z1WatchdogReloaderLoop.__init__.<locals>.<listcomp>z*.pyz*.pycz*.zipc                 S   s   g | ]}d | dqS )z*/z/*r   )r8   dr   r   r   r   L  r;   )patternsignore_patternsF)Zwatchdog.observersr   Zwatchdog.eventsr   r   rd   r   r   lowerr-   r   r   r$   r+   r   event_handlershould_reload)rc   r]   r   r   r   r   Zreloader_nameZextra_patternsr   r   r   rd   1  s(    

zWatchdogReloaderLoop.__init__r|   c                 C   s   d| _ | | d S )NT)r   r   r   r   r   r   r   R  s    z#WatchdogReloaderLoop.trigger_reloadr   c                    s   i | _ | j  t  S r   )watchesr   startr   rg   rf   r   r   r   rg   Y  s    
zWatchdogReloaderLoop.__enter__c                 C   s   | j   | j   d S r   )r   stopr.   rh   r   r   r   rl   ^  s    
zWatchdogReloaderLoop.__exit__c                 C   s*   | j s|   t| j q td d S r~   )r   re   rm   rn   ra   r   r   rf   r   r   r   ro   b  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   r5   r$   r   r   Zscheduler   r   discardrX   Z
unschedule)rc   Z	to_deleter   watchr   r   r   re   i  s    

zWatchdogReloaderLoop.run_step)r   r   r   rH   Anyrd   rJ   r   r`   rg   rl   ro   re   r   r   r   r   r   r   0  s   !r   )r   watchdog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   ru   )	r   stdinisattytermiosImportError	tcgetattrECHO	tcsetattrTCSANOW)r   
attributesr   r   r   ensure_echo_on  s    r   )	main_funcr$   r   ra   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   ra   rr   rq   r   )targetr]   T)signalSIGTERMr   r   rv   r   r   	threadingThreaddaemonr   ro   r   r   r{   KeyboardInterrupt)r   r$   r   ra   r   r   ZreloaderrH   r   r   r   run_with_reloader  s     (r   )NNr   r   )4r    r   rx   r   r   rm   typingrH   	itertoolsr   pathlibr   	_internalr   tuplebase_prefixbase_exec_prefixr   r@   exec_prefixhasattrr'   r   r)   r+   IteratorrJ   r   Setr#   r   r3   r5   r4   Listr_   r`   r   r   r   DictType__annotations__
__import__r   r   Callabler   r   r   r   r   r   r   r   r   <module>   sd   

76=R    