o
    NK&hs                     @  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	 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 d dlmZ G dd dZdS )    )annotationsN)new_event_loop)chain)
Connection)Path)SIGINTSIGTERM)signal)sleep)trigger_events)	AppLoaderc                   @  sR   e Zd ZdZdd
dZdddZdd Zdd Zdd Zdd Z	e
dddZdS )Reloaderg      ?	publisherr   intervalfloatreload_dirs	set[Path]
app_loaderr   c                 C  s(   || _ |p| j| _|| _d| _|| _d S )NT)
_publisherINTERVALr   r   runr   )selfr   r   r   r    r   H/var/www/html/venv/lib/python3.10/site-packages/sanic/worker/reloader.py__init__   s
   
zReloader.__init__returnNonec              	   C  s4  | j  }tt| j tt| j i }|jd}|jd}|jd}|jd}t }|r6t	||| | j
rt }|  D ]%}	z| |	|r[t|	trP|	n|	 }
|t|
 W q@ tye   Y q@w |r|rpt	||| | |ryd|nd |rt	||||d t| j | j
s9|rt	||| d S d S )Nreload_process_startreload_process_stopbefore_reload_triggerafter_reload_trigger,unknown)changed)r   loadsignal_funcr   stopr   	listenersgetr   r   r   setfiles
check_file
isinstancestrresolveaddOSErrorreloadjoinr
   r   )r   appmtimesreloader_startreloader_stopbefore_triggerafter_triggerloopr#   filenamepathr   r   r   __call__"   sH   

zReloader.__call__c                 G  s
   d| _ d S )NF)r   )r   _r   r   r   r&   H   s   
zReloader.stopc                 C  s   d| }| j | d S )Nz__ALL_PROCESSES__:)r   send)r   reloaded_filesmessager   r   r   r1   K   s   
zReloader.reloadc                 C  s    t |  gdd | jD R  S )Nc                 s  s    | ]}| d V  qdS )z**/*N)glob).0dr   r   r   	<genexpr>R   s    z!Reloader.files.<locals>.<genexpr>)r   python_filesr   )r   r   r   r   r*   O   s
   zReloader.filesc                 c  s    t tj D ];}|du rqt|dd}|rCd}tj|s2|}tj|}||kr,ntj|r|dd dv r@|dd }|V  qdS )zThis iterates over all relevant Python files.

        It goes through all
        loaded files from modules, all files in folders of already loaded
        modules as well as all files reachable through a package.
        N__file__)z.pycz.pyo)	listsysmodulesvaluesgetattrosr;   isfiledirname)r   moduler:   oldr   r   r   rE   U   s$   	zReloader.python_filesboolc                 C  sF   d}t | j}|| }|d u r||| < |S ||kr!||| < d}|S )NFT)rN   statst_mtimer(   )r:   r4   need_reloadmtimeold_timer   r   r   r+   n   s   
zReloader.check_fileN)r   r   r   r   r   r   r   r   )r   r   )r   rS   )__name__
__module____qualname__r   r   r<   r&   r1   r*   rE   staticmethodr+   r   r   r   r   r      s    

&r   )
__future__r   rN   rJ   asyncior   	itertoolsr   multiprocessing.connectionr   pathlibr   r	   r   r   r%   timer
   sanic.server.eventsr   sanic.worker.loaderr   r   r   r   r   r   <module>   s    