o
    '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>   .hg.git.nox.tox.mypy_cache.pytest_cache__pycache__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    N/var/www/html/olx_land/venv/lib/python3.10/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   parent_has_pyrootdirsfileshas_pyr   r    r    r!   _find_stat_pathsA   s6   



r?   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   r0   r   r   r1   r"   r,   _find_common_roots)r-   r%   r<   r   r    r    r!   _find_watchdog_pathsw   s   

rA   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'   )itemsr1   r   r   r8   )rI   r   prefixchild_walkrvr    r!   rP      s
   z!_find_common_roots.<locals>._walkr    )rI   rJ   r   rK   r   r&   )sortedlen
setdefaultr6   r/   )r#   r;   chunksrI   chunkr    rO   r!   r@      s   

	r@   	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   r[   r   existsr0   splitextpopappendr   tcaststrr4   extendlstrip)rQ   	py_scriptargsrZ   	py_moduler   r    r    r!   _get_args_for_reloading   s>   








ro   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 )&ReloaderLoopr]   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   r0   rC   r    r    r!   	<setcomp>       z(ReloaderLoop.__init__.<locals>.<setcomp>r    )r-   r/   r%   rr   )selfr-   r%   rr   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rv   r    r    r!   	__enter__   s   zReloaderLoop.__enter__c                 C     dS )z4Clean up any resources associated with the reloader.Nr    rv   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.
        )rx   timesleeprr   ry   r    r    r!   run   s   zReloaderLoop.runc                 C  r{   )z}Run one step for watching the filesystem. Called once to set
        up initial state, then repeatedly to update it.
        Nr    ry   r    r    r!   rx     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_fdsrX   )r   r   ro   r   environcopy
subprocesscall)rv   rm   new_environ	exit_coder    r    r!   restart_with_reloader
  s   
z"ReloaderLoop.restart_with_reloaderfilenameri   c                 C  s   |  | td d S NrX   )
log_reloadr   exitrv   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   r0   r   r   r    r    r!   r     s   zReloaderLoop.log_reload)NNr   )r-   rq   r%   rq   rr   rs   r   r&   r   rp   r   r&   )r   r   )r   ri   r   r&   r   r   r   r&   )__name__
__module____qualname__r   rw   rz   r   r   rx   r   r   r   r    r    r    r!   rp      s    





rp   c                      s,   e Zd ZdZd	 fddZd
ddZ  ZS )StatReloaderLoopstatr   rp   c                   s   i | _ t  S r'   )mtimessuperrz   ry   	__class__r    r!   rz   $  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'   )
r?   r-   r%   r   r   st_mtimeOSErrorr   getr   )rv   r   mtimeold_timer    r    r!   rx   (  s   

zStatReloaderLoop.run_stepr   r   )r   r   r   r   rz   rx   __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 )WatchdogReloaderLooprm   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'   )
event_typesrc_path)rv   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)rD   pr    r    r!   
<listcomp>a  s    z1WatchdogReloaderLoop.__init__.<locals>.<listcomp>z*.pyz*.pycz*.zipc                 S  s   g | ]}d | dqS )z*/z/*r    )rD   dr    r    r!   r   e  ru   )patternsignore_patternsF)watchdog.eventsr   r   r   r   r   r   r   watchdog.observersr   r   rw   r   r   lowerr7   r   r   r-   r5   r%   event_handlershould_reload)	rv   rm   r   r   r   r   r   reloader_nameextra_patternsr   r   r!   rw   :  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_reloadrp   c                   s   i | _ | j  t  S r'   )watchesr   startr   rz   ry   r   r    r!   rz   r  s   

zWatchdogReloaderLoop.__enter__c                 C  s   | j   | j   d S r'   )r   stopr8   r|   r    r    r!   r   w  r   zWatchdogReloaderLoop.__exit__c                 C  s.   | j s|   t| j | j rtd d S r   )r   rx   r   r   rr   r   r   ry   r    r    r!   r   {  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   rA   r-   r%   r   scheduler   r   discardre   
unschedule)rv   	to_deleter   watchr    r    r!   rx     s"   

zWatchdogReloaderLoop.run_step)rm   r   r   r   r   r&   r   r   r   )
r   r   r   rw   r   rz   r   r   rx   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   rX   )	r   stdinisattytermiosImportError	tcgetattrECHO	tcsetattrTCSANOW)r   
attributesr    r    r!   ensure_echo_on  s   r   	main_funct.Callable[[], None]rq   rr   rs   reloader_typeri   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   )rm   r    r    r!   <lambda>  s   
 z#run_with_reloader.<locals>.<lambda>)r-   r%   rr   r   r   r    )targetrm   T)signalSIGTERMr   r   r   r   r   	threadingThreaddaemonr   r   r   r   r   KeyboardInterrupt)r   r-   r%   rr   r   r   reloaderrg   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   rW   r   )NNr   r   )r   r   r-   rq   r%   rq   rr   rs   r   ri   r   r&   )*
__future__r   r)   r   r   r   r   r   typingrg   	itertoolsr   pathlibr   	_internalr   tuplebase_prefixbase_exec_prefixr   rM   exec_prefixhasattrr1   r   r3   r5   r"   r,   r?   rA   r@   ro   rp   r   r   r   __annotations__
__import__r   r   r   r    r    r    r!   <module>   sT    




6

;=b
