U
    en                     @  s   d dl mZ d dlZd dlZd dlmZ d dlmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZ er~d dlZeje Zed	ZG d
d deZG dd deZdS )    )annotationsNPath)socket)TYPE_CHECKINGCallable)DefaultWatcher)Config)
BaseReloadzuvicorn.errorc                      sD   e Zd Zddd fddZdddd	d
ZdddddZ  ZS )CustomWatcherr   r	   )	root_pathconfigc                   s   dg} fdd|D | _ | j  j tt| j | _ ddddg} fdd|D | _| j j tt| j| _i | _i | _t j	| _
t j| _|| _t t| d S )	Nz*.pyc                   s   g | ]}| j kr|qS  )reload_excludes.0defaultr   r   F/tmp/pip-unpacked-wheel-cq1xfpla/uvicorn/supervisors/watchgodreload.py
<listcomp>   s     
 z*CustomWatcher.__init__.<locals>.<listcomp>z.*z.py[cod]z.sw.*z~*c                   s   g | ]}| j kr|qS r   )reload_includesr   r   r   r   r      s     
 )includesextendr   listsetexcludesr   watched_dirswatched_filesreload_dirsdirs_includesZreload_dirs_excludesdirs_excludesresolved_rootsuper__init__str)selfr   r   Zdefault_includesZdefault_excludes	__class__r   r   r#      s    zCustomWatcher.__init__DirEntrybool)entryreturnc                 C  s   | j |j}|d k	r|S t|}|jt krNt | jkrNd| j |j< dS | jD ]j}t|	|rxd| j |j<  dS |
|rT| jD ]"}|
|rd| j |j<   dS qd| j |j<  dS qTd| j |j< dS )NFT)r   getpathr   parentcwdr   r   r$   endswithmatchr   )r%   r*   cached_result
entry_pathinclude_patternexclude_patternr   r   r   should_watch_file)   s(    




zCustomWatcher.should_watch_filec                 C  sf  | j |j}|d k	r|S t|}|| jkr<d| j |j< dS | jD ]x}||rBd}|| jkrbd}| jD ]}||jkrhd}qh|rt	
d|| jt| j d| j |j< | j|  dS qB|| jkrd| j |j< dS | jD ] }||jkrd| j |j<  dS q| jD ]P}||rt	dt|| jt| j | j| d| j |j<  dS qd| j |j< dS )NFTzPWatchGodReload detected a new excluded dir '%s' in '%s'; Adding to exclude list.zLWatchGodReload detected a new reload dir '%s' in '%s'; Adding to watch list.)r   r,   r-   r   r    r   r1   r   parentsloggerdebugrelative_tor!   r$   addr   info)r%   r*   r2   r3   r5   Z
is_watched	directoryr4   r   r   r   should_watch_dirB   sV    











zCustomWatcher.should_watch_dir)__name__
__module____qualname__r#   r6   r>   __classcell__r   r   r&   r   r      s   r   c                      s6   e Zd Zddddd fddZdd	d
dZ  ZS )WatchGodReloadr	   z%Callable[[list[socket] | None], None]zlist[socket]None)r   targetsocketsr+   c                   s   t dt t ||| d| _g | _g }|jD ]}t	 |j
kr2|| q2t	 |krj|t	  |D ]}| jt| | j qnd S )NzU"watchgod" is deprecated, you should switch to watchfiles (`pip install watchfiles`).ZWatchGod)warningswarnDeprecationWarningr"   r#   Zreloader_namewatchersr   r   r/   r7   appendr   resolver   )r%   r   rE   rF   r   r=   wr&   r   r   r#   z   s    
zWatchGodReload.__init__zlist[Path] | None)r+   c                 C  s@   |    | jD ],}| }|t krtdd |D   S qd S )Nc                 S  s   h | ]}t |d  qS )   r   )r   cr   r   r   	<setcomp>   s     z0WatchGodReload.should_restart.<locals>.<setcomp>)pauserJ   checkr   r   )r%   ZwatcherZchanger   r   r   should_restart   s    

zWatchGodReload.should_restart)r?   r@   rA   r#   rS   rB   r   r   r&   r   rC   y   s   rC   )
__future__r   loggingrG   pathlibr   r   typingr   r   Zwatchgodr   Zuvicorn.configr	   Zuvicorn.supervisors.basereloadr
   osr(   r$   	getLoggerr8   r   rC   r   r   r   r   <module>   s   

c