o
    4ήc                     @   s   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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edefddZdS )    N)Path)socket)	FrameType)CallableIteratorListOptional)get_subprocess)Configzuvicorn.errorc                   @   s   e Zd Zdedeeee  gdf dee ddfddZde	d	ee
 ddfd
dZdddZdddZdeeee   fddZdeee  fddZdddZdddZdddZdeee  fddZdS )
BaseReloadconfigtargetNsocketsreturnc                 C   s0   || _ || _|| _t | _t | _d | _	d S N)
r   r   r   	threadingEventshould_exitosgetpidpidreloader_name)selfr   r   r    r   E/tmp/pip-target-vg8gfxp4/lib/python/uvicorn/supervisors/basereload.py__init__   s   


zBaseReload.__init__sigframec                 C   s   | j   dS )zN
        A signal handler that is registered with the parent process.
        N)r   set)r   r   r   r   r   r   signal_handler%   s   zBaseReload.signal_handlerc              
   C   sF   |    | D ]}|rtd| jdtt| |   q|   d S )Nz'%s detected changes in %s. Reloading...z, )	startuploggerwarningr   joinmap_display_pathrestartshutdown)r   changesr   r   r   run+   s   zBaseReload.runc                 C   s   | j | jjrt d S r   )r   waitr   reload_delayStopIterationr   r   r   r   pause8   s   zBaseReload.pausec                 C   s   | S r   r   r-   r   r   r   __iter__<   s   zBaseReload.__iter__c                 C   s   |   S r   )should_restartr-   r   r   r   __next__?      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
 q-t| j| j| jd	| _| j  d S )
NzStarted reloader process [z] using z&Started reloader process [{}] using {}cyanTfgboldcolor_messageextrar   r   r   )r   r   formatclickstylestrr!   infoHANDLED_SIGNALSsignalr   r	   r   r   r   processstart)r   messager7   r   r   r   r   r    B   s   zBaseReload.startupc                 C   s8   | j   | j   t| j| j| jd| _ | j   d S )Nr:   )rB   	terminater#   r	   r   r   r   rC   r-   r   r   r   r&   R   s   

zBaseReload.restartc                 C   sj   | j   | j   | jD ]}|  qdt| j}dtj	t| jddd}t
j|d|id d S )NzStopping reloader process [{}]r3   Tr4   r7   r8   )rB   rE   r#   r   closer;   r>   r   r<   r=   r!   r?   )r   sockrD   r7   r   r   r   r'   \   s   



zBaseReload.shutdownc                 C   s   t d)Nz2Reload strategies should override should_restart())NotImplementedErrorr-   r   r   r   r0   i   r2   zBaseReload.should_restart)r   N)__name__
__module____qualname__r
   r   r   r   r   r   intr   r   r)   r.   r   r   r/   r1   r    r&   r'   r0   r   r   r   r   r      s&    






r   pathr   c                 C   s8   zd|  t  dW S  ty   d|  d Y S w )N')relative_tor   cwd
ValueError)rM   r   r   r   r%   m   s
   r%   )loggingr   rA   r   pathlibr   r   typesr   typingr   r   r   r   r<   uvicorn._subprocessr	   uvicorn.configr
   SIGINTSIGTERMr@   	getLoggerr!   r   r>   r%   r   r   r   r   <module>   s"    
V