U
    Rh                     @  s   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mZ d dl	m	Z	 d dl
mZ d dlmZmZ d dlZd dlmZ d dlmZ ejejfZed	ZG d
d dZdddddZdS )    )annotationsN)Path)socket)	FrameType)CallableIterator)get_subprocess)Configzuvicorn.errorc                   @  s   e Zd ZdddddddZdd	dd
ddZddddZddddZddddZddddZddddZ	ddddZ
ddddZddddZd S )!
BaseReloadr	   z%Callable[[list[socket] | None], None]zlist[socket]None)configtargetsocketsreturnc                 C  s6   || _ || _|| _t | _t | _d| _	d | _
d S )NF)r   r   r   	threadingEventshould_exitosgetpidpidis_restartingreloader_name)selfr   r   r    r   D./venv/lib/python3.8/site-packages/uvicorn/supervisors/basereload.py__init__   s    

zBaseReload.__init__intzFrameType | None)sigframer   c                 C  s&   t jdkr| jrd| _n
| j  dS )zN
        A signal handler that is registered with the parent process.
        win32FN)sysplatformr   r   set)r   r   r   r   r   r   signal_handler)   s    zBaseReload.signal_handler)r   c              
   C  sF   |    | D ],}|rtd| jdtt| |   q|   d S )Nz'%s detected changes in %s. Reloading...z, )	startuploggerZwarningr   joinmap_display_pathrestartshutdown)r   Zchangesr   r   r   run2   s    
zBaseReload.runc                 C  s   | j | jjrt d S N)r   waitr   Zreload_delayStopIterationr   r   r   r   pause?   s    zBaseReload.pausezIterator[list[Path] | None]c                 C  s   | S r,   r   r/   r   r   r   __iter__C   s    zBaseReload.__iter__zlist[Path] | Nonec                 C  s   |   S r,   )should_restartr/   r   r   r   __next__F   s    zBaseReload.__next__c                 C  s   d| j  d| j }dtjt| j dddtjt| jddd}tj|d|id tD ]}t		|| j
 qZt| j| j| jd	| _| j  d S )
NzStarted reloader process [z] using z&Started reloader process [{}] using {}cyanTZfgZboldcolor_messageZextrar   r   r   )r   r   formatclickstylestrr%   infoHANDLED_SIGNALSsignalr#   r   r   r   r   processstart)r   messager6   r   r   r   r   r$   I   s    zBaseReload.startupc                 C  sl   t jdkr4d| _| jjd k	s tt| jjtj	 n
| j
  | j  t| j| j| jd| _| j  d S )Nr   Tr8   )r    r!   r   r@   r   AssertionErrorr   killr?   ZCTRL_C_EVENT	terminater&   r   r   r   r   rA   r/   r   r   r   r)   W   s    


zBaseReload.restartc                 C  s   t jdkr| j  n
| j  | j  | jD ]}|  q0dt	| j
 d}dtjt	| j
ddd}tj|d|id	 d S )
Nr   zStopping reloader process []zStopping reloader process [{}]r4   Tr5   r6   r7   )r    r!   r   r"   r@   rE   r&   r   closer<   r   r9   r:   r;   r%   r=   )r   ZsockrB   r6   r   r   r   r*   c   s    




zBaseReload.shutdownc                 C  s   t dd S )Nz2Reload strategies should override should_restart())NotImplementedErrorr/   r   r   r   r2   q   s    zBaseReload.should_restartN)__name__
__module____qualname__r   r#   r+   r0   r1   r3   r$   r)   r*   r2   r   r   r   r   r
      s   	r
   r   r<   )pathr   c                 C  s>   zd|  t  dW S  tk
r8   d|  d Y S X d S )N')relative_tor   cwd
ValueError)rL   r   r   r   r(   u   s    r(   )Z
__future__r   Zloggingr   r?   r    r   pathlibr   r   typesr   typingr   r   r:   Zuvicorn._subprocessr   Zuvicorn.configr	   SIGINTSIGTERMr>   Z	getLoggerr%   r
   r(   r   r   r   r   <module>   s$   
[