o
    1)hE<                     @  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rReej eeZ[h dZd6ddZd7ddZd8ddZd8ddZd9ddZ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w e$d* e$d)< d;d+d,Z(				)d<d=d4d5Z)dS )>    )annotationsN)chain)PurePath   )_logreal_prefix>   z.tox__pycache__z.hgz.pytest_cachez.gitz.noxz.mypy_cachereturnt.Iterator[str]c                  c  sr    t tj D ].} t| dd}|du s|trqtj	|s3|}tj
|}||kr-n	tj	|r |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   QC:\Users\User\Downloads\Proyecto_IoT\venv\Lib\site-packages\werkzeug/_reloader.py_iter_module_paths(   s   r   pathsset[str]exclude_patternsNonec                 C  s    |D ]}|  t| | qd S N)difference_updatefnmatchfilter)r   r   patternr   r   r   _remove_by_pattern<   s   r&   extra_filest.Iterable[str]c           
   	   C  s   t  }tttj| D ]d}tj|}tj|r|| qtj	|di}t
|D ]B\}}}|ts>tj|tv rC|  q,d}|D ]}	|	drZd}|tj||	 qG|sj|tj	| sj|  q,|||< q,q|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   s6   



r7   c                 C  sz   t  }tttj| D ]}tj|}tj|rtj|}|	| qt
 D ]}|	tj| q(t|| 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   r5   r   r   r   r   _find_watchdog_pathsw   s   

r9   c                   sh   i }t dd | D tddD ]}|}|D ]}||i }q|  qt d fdd  |d S )Nc                 s  s    | ]}t |jV  qd S r!   )r   parts.0xr   r   r   	<genexpr>   s    z%_find_common_roots.<locals>.<genexpr>T)keyreversenode t.Mapping[str, dict[str, t.Any]]r   tuple[str, ...]r	   r    c                   sH   |   D ]\}} |||f  q| s |r"tjj|  d S d S d S r!   )itemsr+   r   r   r2   )rA   r   prefixchild_walkrvr   r   rH      s
   z!_find_common_roots.<locals>._walkr   )rA   rB   r   rC   r	   r    )sortedlen
setdefaultr0   r)   )r   r4   chunksrA   chunkr   rG   r   r8      s   

	r8   	list[str]c                  C  sx  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 sFtjdkr|j	dkrtj
|stj
| d	rtj
|}tjdkr~tj
|sdtj
| d	rd|d	7 }tj
t jd d	kr~tj
|d d	kr~| d | | n1tj
|rt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   Nr   __main____package__nt z.exe.z-m)r   version_info
executable	orig_argvargvr   r   r   r   rS   r   existsr*   splitextpopappendr   tcaststrr.   extendlstrip)rI   Z	py_scriptargsrR   Z	py_moduler   r   r   r   _get_args_for_reloading   s>   








re   c                   @  sf   e Zd ZdZ			dd ddZd!ddZdd Zd"ddZd"ddZd#ddZ	d$ddZ
d%ddZdS )&ReloaderLooprU   Nr   r'   t.Iterable[str] | Noner   intervalint | floatr	   r    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*   r;   r   r   r   	<setcomp>       z(ReloaderLoop.__init__.<locals>.<setcomp>r   )r'   r)   r   rh   )selfr'   r   rh   r   r   r   __init__   s   
zReloaderLoop.__init__c                 C  s   |    | S )zgDo any setup, then run one step of the watch to populate the
        initial filesystem state.
        )run_steprl   r   r   r   	__enter__   s   zReloaderLoop.__enter__c                 C     dS )z4Clean up any resources associated with the reloader.Nr   rl   exc_typeexc_valexc_tbr   r   r   __exit__   s   zReloaderLoop.__exit__c                 C  s   	 |    t| j q)zfContinually run the watch step, sleeping for the configured
        interval after each step.
        )rn   timesleeprh   ro   r   r   r   run   s   zReloaderLoop.runc                 C  rq   )z}Run one step for watching the filesystem. Called once to set
        up initial state, then repeatedly to update it.
        Nr   ro   r   r   r   rn     s   zReloaderLoop.run_stepintc                 C  sJ   	 t dd| j  t }tj }d|d< tj||dd}|dkr$|S q)	z|Spawn a new Python interpreter with the same arguments as the
        current one, but running the reloader thread.
        Tinfoz * Restarting with trueWERKZEUG_RUN_MAINF)env	close_fdsrP   )r   r   re   r   environcopy
subprocesscall)rl   rd   Znew_environ	exit_coder   r   r   restart_with_reloader
  s   
z"ReloaderLoop.restart_with_reloaderfilenamera   c                 C  s   |  | td d S NrP   )
log_reloadr   exitrl   r   r   r   r   trigger_reload     
zReloaderLoop.trigger_reloadstr | bytesc                 C  s"   t j|}tdd|d d S )Nr{   z * Detected change in z, reloading)r   r   r*   r   r   r   r   r   r     s   zReloaderLoop.log_reload)NNr   )r'   rg   r   rg   rh   ri   r	   r    r	   rf   r	   r    )r	   rz   )r   ra   r	   r    r   r   r	   r    )__name__
__module____qualname__r   rm   rp   rv   ry   rn   r   r   r   r   r   r   r   rf      s    





rf   c                      s,   e Zd ZdZd	 fddZd
ddZ  ZS )StatReloaderLoopstatr	   rf   c                   s   i | _ t  S r!   )mtimessuperrp   ro   	__class__r   r   rp   $  s   
zStatReloaderLoop.__enter__r    c              	   C  sn   t | j| jD ]-}zt|j}W n	 ty   Y qw | j|}|d u r+|| j|< q||kr4| 	| qd S r!   )
r7   r'   r   r   r   st_mtimeOSErrorr   getr   )rl   r   mtimeZold_timer   r   r   rn   (  s   

zStatReloaderLoop.run_stepr   r   )r   r   r   r   rp   rn   __classcell__r   r   r   r   r   !  s    r   c                      sR   e Zd Zd fddZdd
dZd fddZdd ZdddZdddZ  Z	S )WatchdogReloaderLooprd   t.Anykwargsr	   r    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 fddZdS )z3WatchdogReloaderLoop.__init__.<locals>.EventHandlereventr   c                   s&   |j  hvrd S |j d S r!   )Z
event_typeZsrc_path)rl   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   EventHandlerG  s    r   observeriz
watchdog ()c                 S  s   g | ]
}t j|s|qS r   )r   r   isdir)r<   pr   r   r   
<listcomp>a  s    z1WatchdogReloaderLoop.__init__.<locals>.<listcomp>z*.pyz*.pycz*.zipc                 S  s   g | ]}d | dqS )z*/z/*r   )r<   dr   r   r   r   e  rk   )patternsignore_patternsF)Zwatchdog.eventsr   r   r   r   r   r   r   Zwatchdog.observersr   r   rm   r   r   lowerr1   r   r   r'   r/   r   event_handlershould_reload)	rl   rd   r   r   r   r   r   Zreloader_nameZextra_patternsr   r   r   rm   :  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_reloadrf   c                   s   i | _ | j  t  S r!   )watchesr   startr   rp   ro   r   r   r   rp   r  s   

zWatchdogReloaderLoop.__enter__c                 C  s   | j   | j   d S r!   )r   stopr2   rr   r   r   r   rv   w  r   zWatchdogReloaderLoop.__exit__c                 C  s.   | j s|   t| j | j rtd d S r   )r   rn   rw   rx   rh   r   r   ro   r   r   r   ry   {  s
   zWatchdogReloaderLoop.runc              	   C  s   t | j}t| j| jD ]*}|| jvr1z| jj| j|dd| j|< W n ty0   d | j|< Y nw |	| q|D ]}| j
|d }|d urL| j| q9d S )NT)	recursive)r)   r   r9   r'   r   r   Zscheduler   r   discardr]   Z
unschedule)rl   Z	to_deleter   watchr   r   r   rn     s"   

zWatchdogReloaderLoop.run_step)rd   r   r   r   r	   r    r   r   r   )
r   r   r   rm   r   rp   rv   ry   rn   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y   Y dS w | t j}|d | j@ s>|d  | jO  < | t j| j| dS dS )zuEnsure that echo mode is enabled. Some tools such as PDB disable
    it which causes usability issues after a reload.Nr   rP   )	r   stdinisattytermiosImportError	tcgetattrECHO	tcsetattrZTCSANOW)r   
attributesr   r   r   ensure_echo_on  s   r   	main_funct.Callable[[], None]rg   rh   ri   reloader_typera   c                 C  s   ddl }| |jdd  t| |||d}z>tjddkrKt  tj| dd	}d
|_	| |
  |  W d   W dS 1 sCw   Y  W dS t|  W dS  ty^   Y dS w )z<Run the given function in an independent Python interpreter.r   Nc                  W  s
   t dS )Nr   )r   r   )rd   r   r   r   <lambda>  s   
 z#run_with_reloader.<locals>.<lambda>)r'   r   rh   r}   r|   r   )targetrd   T)signalSIGTERMr   r   r   r   r   	threadingThreaddaemonr   ry   r   r   r   KeyboardInterrupt)r   r'   r   rh   r   r   Zreloaderr_   r   r   r   run_with_reloader  s$   
&r   )r	   r
   )r   r   r   r   r	   r    )r'   r   r   r   r	   r(   )r   r(   r	   r(   )r	   rO   r   )NNr   r   )r   r   r'   rg   r   rg   rh   ri   r   ra   r	   r    )*
__future__r   r#   r   r   r   r   rw   typingr_   	itertoolsr   pathlibr   	_internalr   tuplebase_prefixbase_exec_prefixr   rE   exec_prefixhasattrr+   r   r-   r/   r   r&   r7   r9   r8   re   rf   r   r   r   __annotations__
__import__r   r   r   r   r   r   r   <module>   sT    




6

;=b
