o
    i-                     @   s  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	 ddlm
Z
 ddlmZ dd	 Zdd
dZdd Zdd ZG dd deZG dd deZG dd deZeedZzed W n eyu   ed ed< Y nw ed ed< dd Zd ddZdS )!    N)chain   )	iteritems)PY2)	text_type)_logc                  c   s    t tj D ]S} | du rqt| dd}|r[tj|r/tjtj	|dr/tj	|d}d}tj
|sJ|}tj|}||krDntj
|r7|dd dv rX|dd }|V  qdS )zThis iterates over all relevant Python files.  It goes through all
    loaded files from modules, all files in folders of already loaded modules
    as well as all files reachable through a package.
    N__file__z__init__.py).pyc.pyo)listsysmodulesvaluesgetattrospathisdirexistsjoinisfiledirname)modulefilenameold r   M/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/werkzeug/_reloader.py_iter_module_files   s,   r   c                 C   s   t dd tjD }| pdD ]}|tjtj| qttj	 D ]}t
|dd}|du r2q%tj|}|tj| q%t|S )z(Finds all paths that should be observed.c                 s   s<    | ]}t j|rt jt j|nt j|V  qd S N)r   r   r   r   abspath.0xr   r   r   	<genexpr>-   s
    *
z)_find_observable_paths.<locals>.<genexpr>r   r   N)setr   r   addr   r   r    r   r   r   r   _find_common_roots)extra_filesrvr   r   fnr   r   r   _find_observable_paths+   s   r+   c                  C   s`  t jg} t jd }t jdd }t jd }t|dddu s5tjdkrr|jdkrrtj	|srtj	|d rrtj
|}tjdkrltj	|sRtj	|d rR|d7 }tjt jd dkrltj|d dkrl| d | | n7t jd d	kr}t j}n,tj|r|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.exez-m.)r   
executableargvr   r   r   namer-   r   r   r    splitextpopappendr   basenameextendlstrip)r)   	py_scriptargsr,   	py_moduler3   r   r   r   _get_args_for_reloading?   s>   







r=   c                    sj   dd | D } i }t | tddD ]}|}|D ]}||i }q|  qt  fdd  |d S )zAOut of some paths it finds the common roots that need monitoring.c                 S   s   g | ]	}| tjjqS r   )splitr   r   sepr!   r   r   r   
<listcomp>}   s    z&_find_common_roots.<locals>.<listcomp>T)keyreversec                    s>   t | D ]\}} |||f  q| sd| d S d S )N/)r   r&   r   )noder   prefixchild_walkr)   r   r   rH      s
   z!_find_common_roots.<locals>._walkr   )sortedlen
setdefaultclearr%   )pathsrootchunksrD   chunkr   rG   r   r'   {   s   

r'   c                   @   sD   e Zd ZdZeejZdddZdd Z	dd Z
d	d
 Zdd ZdS )ReloaderLoopNr   c                 C   s"   t dd |pdD | _|| _d S )Nc                 s   s    | ]	}t j|V  qd S r   )r   r   r    r!   r   r   r   r$      s    z(ReloaderLoop.__init__.<locals>.<genexpr>r   )r%   r(   interval)selfr(   rR   r   r   r   __init__   s   
zReloaderLoop.__init__c                 C   s   d S r   r   rS   r   r   r   run   s   zReloaderLoop.runc                 C   s   	 t dd| j  t }tjdkr8tr8i }ttjD ]\}}t|tr(|	d}t|tr2|	d}|||< qntj
 }d|d< tj||dd	}|d
krO|S q)zuSpawn a new Python interpreter with the same arguments as this one,
        but running the reloader thread.
        r   infoz * Restarting with %sr.   z
iso-8859-1trueWERKZEUG_RUN_MAINF)env	close_fds   )r   r3   r=   r   r   r   environ
isinstancer   encodecopy
subprocesscall)rS   r;   new_environrA   value	exit_coder   r   r   restart_with_reloader   s$   





z"ReloaderLoop.restart_with_reloaderc                 C   s   |  | td d S )Nr\   )
log_reloadr   exitrS   r   r   r   r   trigger_reload      
zReloaderLoop.trigger_reloadc                 C   s   t j|}tdd|  d S )NrW   z# * Detected change in %r, reloading)r   r   r    r   ri   r   r   r   rg      s   zReloaderLoop.log_reload)Nr   )__name__
__module____qualname__r3   staticmethodtimesleep_sleeprT   rV   rf   rj   rg   r   r   r   r   rQ      s    

rQ   c                   @   s   e Zd ZdZdd ZdS )StatReloaderLoopstatc              	   C   sz   i }	 t t | jD ]+}zt|j}W n	 ty   Y q
w ||}|d u r,|||< q
||kr5| | q
| 	| j
 qr   )r   r   r(   r   rt   st_mtimeOSErrorgetrj   rr   rR   )rS   mtimesr   mtimeold_timer   r   r   rV      s"   

zStatReloaderLoop.runN)rl   rm   rn   r3   rV   r   r   r   r   rs      s    rs   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )WatchdogReloaderLoopc                    s   t jg|R i | ddlm} ddlm} t _fdd G  fddd|}|j	 }|
dr<|d d	 }|d
7 }|_|_| _d_d S )Nr   )Observer)FileSystemEventHandlerc                    sP   |  j v r
 |  tj| }|t jr$| dr& |  d S d S d S )N)r
   r   z.py)	r(   rj   r   r   r   
startswithtupleobservable_pathsendswith)r   r   rU   r   r   _check_modification   s   


z:WatchdogReloaderLoop.__init__.<locals>._check_modificationc                       s<   e Zd Z fddZ fddZ fddZ fddZd	S )
z5WatchdogReloaderLoop.__init__.<locals>._CustomHandlerc                        |j  d S r   src_pathrS   eventr   r   r   
on_created      z@WatchdogReloaderLoop.__init__.<locals>._CustomHandler.on_createdc                    r   r   r   r   r   r   r   on_modified   r   zAWatchdogReloaderLoop.__init__.<locals>._CustomHandler.on_modifiedc                    s    |j   |j d S r   )r   	dest_pathr   r   r   r   on_moved   rk   z>WatchdogReloaderLoop.__init__.<locals>._CustomHandler.on_movedc                    r   r   r   r   r   r   r   
on_deleted   r   z@WatchdogReloaderLoop.__init__.<locals>._CustomHandler.on_deletedN)rl   rm   rn   r   r   r   r   r   r   r   r   _CustomHandler   s
    r   observeriz	 reloaderF)rQ   rT   watchdog.observersr|   watchdog.eventsr}   r%   r   rl   lowerr   r3   observer_classevent_handlershould_reload)rS   r;   kwargsr|   r}   r   reloader_namer   )r   rS   r   rT      s   


zWatchdogReloaderLoop.__init__c                 C   s   d| _ | | d S )NT)r   rg   ri   r   r   r   rj     s   z#WatchdogReloaderLoop.trigger_reloadc              	   C   s   i }|   }|  z_| js`t|}t| j}|D ]&}||vr:z|j| j|dd||< W n ty9   d ||< Y nw |	| q|D ]}|
|d }|d urS|| qB|| _| | j | jrW |  |  n	|  |  w td d S )NT)	recursiver\   )r   startr   r%   r+   r(   scheduler   rv   discardr5   
unscheduler   rr   rR   stopr   r   rh   )rS   watchesr   	to_deleterM   r   watchr   r   r   rV   	  s>   



zWatchdogReloaderLoop.runN)rl   rm   rn   rT   rj   rV   r   r   r   r   r{      s    (r{   )rt   watchdogzwatchdog.observersrt   autor   c                  C   sv   t j sdS zddl} W n
 ty   Y dS w | t j}|d | j@ s9|d  | jO  < | t j| j| dS dS )zsEnsure that echo mode is enabled. Some tools such as PDB disable
    it which causes usability issues after reload.Nr   r\   )	r   stdinisattytermiosImportError	tcgetattrECHO	tcsetattrTCSANOW)r   
attributesr   r   r   ensure_echo_on5  s   
r   c                 C   s   ddl }t| ||}| |jdd  z,tjddkr7t  tj| dd}|	d	 |
  |  W dS t|  W dS  tyJ   Y dS w )
z<Run the given function in an independent python interpreter.r   Nc                  W   s
   t dS )Nr   )r   rh   )r;   r   r   r   <lambda>J  s   
 z#run_with_reloader.<locals>.<lambda>rY   rX   r   )targetr;   T)signalreloader_loopsSIGTERMr   r]   rw   r   	threadingThread	setDaemonr   rV   r   rh   rf   KeyboardInterrupt)	main_funcr(   rR   reloader_typer   reloadertr   r   r   run_with_reloaderE  s   
r   r   )Nr   r   )r   ra   r   r   rp   	itertoolsr   _compatr   r   r   	_internalr   r   r+   r=   r'   objectrQ   rs   r{   r   
__import__r   r   r   r   r   r   r   <module>   s4    
<3
R