U
    .WjØ  ã                   @   sÂ   U d 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 e ¡ aG dd„ dƒZi Ze	eef ed	< d
d„ Zdd„ ZG dd„ deƒZdd„ Zdd„ Zddd„ZdS )z&
*Real* reloading support for Python.
é    N)Úreload)Ú
ModuleType)ÚDict)ÚlogÚreflectc                   @   s,   e Zd ZdZeZdd„ Zdd„ Zdd„ ZdS )	Ú	SensitivezÐ
    A utility mixin that's sensitive to rebuilds.

    This is a mixin for classes (usually those which represent collections of
    callbacks) to make sure that their code is up-to-date before running.
    c                 C   s   | j t k }|S ©N)ÚlastRebuild)ÚselfZyn© r   úac:\users\psant\downloads\hotstarbackend\school\venv38\Lib\site-packages\twisted/python/rebuild.pyÚneedRebuildUpdate$   s    
zSensitive.needRebuildUpdatec                 C   s   t   ¡ | _d S r   )Útimer	   ©r
   r   r   r   ÚrebuildUpToDate(   s    zSensitive.rebuildUpToDatec                 C   s^   t |ƒ}|tjkrt|ƒS |tjkrL|jdkr<t|j|jƒS t|j|jƒS nt	 
d¡ |S dS )z¡
        Get the latest version of an object.

        This can handle just about anything callable; instances, functions,
        methods, and classes.
        Nzwarning returning anObject!)ÚtypeÚtypesÚFunctionTypeÚlatestFunctionÚ
MethodTypeÚ__self__ÚgetattrÚim_classÚ__name__r   Úmsg)r
   ZanObjectÚtr   r   r   ÚlatestVersionOf+   s    



zSensitive.latestVersionOfN)r   Ú
__module__Ú__qualname__Ú__doc__r	   r   r   r   r   r   r   r   r      s
   r   Ú_modDictIDMapc                 C   s,   t | jƒ}t |¡}|dkr | S t|| jƒS )z/
    Get the latest version of a function.
    N)ÚidÚ__globals__r    Úgetr   r   )ZoldFuncZdictIDÚmoduler   r   r   r   B   s
    

r   c                 C   s€   t  | j¡}t|| jƒ}dd„ |jD ƒ}|jdkr6|S zt|ƒ|_|W S  tk
rz   t|ƒ}||jt|ƒt	|j
ƒƒ Y S X dS )z,
    Get the latest version of a class.
    c                 S   s   g | ]}t |ƒ‘qS r   )ÚlatestClass)Ú.0Úbaser   r   r   Ú
<listcomp>U   s     zlatestClass.<locals>.<listcomp>ÚbuiltinsN)r   ZnamedModuler   r   r   Ú	__bases__ÚtupleÚ	TypeErrorr   ÚdictÚ__dict__)ZoldClassr$   ZnewClassZnewBasesZctorr   r   r   r%   O   s    

r%   c                   @   s   e Zd ZdZdS )ÚRebuildErrorzT
    Exception raised when trying to rebuild a class whereas it's not possible.
    N)r   r   r   r   r   r   r   r   r/   d   s   r/   c                 C   s   t | jƒ| _dS )z,
    Updates an instance to be current.
    N)r%   Ú	__class__r   r   r   r   ÚupdateInstancej   s    r1   c                 C   sF   |dkrt dƒ‚t| ƒ t dt | j¡› d|› d�¡ t| |ƒ}|S )z<
    A getattr method to cause a class to be refreshed.
    Ú__del__zWithout this, Python segfaults.z(rebuilding stale z instance (z)))ÚAttributeErrorr1   r   r   r   Úqualr0   r   )r
   ÚnameÚresultr   r   r   Ú__injectedgetattr__q   s     
r7   é   c              
   C   sè  t   ¡ at| dƒr | js tdƒ‚|r<t dt| jƒ› d�¡ ddl	m
} d|_| j}| tt|ƒ< i }i }i }i }|rŒt dt| jƒ› d	�¡ | ¡ D ]€\}}	tt|	ƒtjƒrÜ|	j| jkrÚd
||	< |rÚtj d¡ tj ¡  q”t|	tƒr”|	j| jkr”d
||	< |r”tj d¡ tj ¡  q”| |¡ | |¡ |j}
| ¡ }| ¡ }| ¡ }|�rpt d¡ t dt| jƒ› d�¡ t| ƒ t ¡  |�ržt dt| jƒ› d	�¡ |D ]l}t | |jƒ|k�rÒt dt! "|¡› d�¡ n:|�rîtj d¡ tj ¡  d|_#|j $¡  t%|_&| j|_�q¢|�rddl'}|D ]^}t | |jƒ}||k�rTt d (t! "|¡¡¡ n*| )|¡D ]}t |ddƒ|k�r^||_*�q^�q"|�rªt d¡ t dt| jƒ› d	�¡ d}t+j, ¡ D ]ü\}}|d
 }|| k�s¸|dk�rà�q¸t|dƒ�sð�q¸t|dƒ�r �q¸d}|j ¡ D ]r\}}	zt-|	ƒ W n t.k
�r>   Y �qY nX |
|	ƒ�r|�rftj d¡ tj ¡  t/|	ƒ}d
}t0|||ƒ �q|�r¸|�s¸|d dk�r¸tj d¡ tj ¡  �q¸d|_|�rät d¡ t dt| jƒ› d�¡ | S )zO
    Reload a module and do as much as possible to replace its references.
    ÚALLOW_TWISTED_REBUILDzI am not allowed to be rebuilt.zRebuilding z...r   )Ú
componentsTz  (scanning z): r8   ÚfÚoÚ z  (reload   ú)z  (cleaning zWARNING: class z not replaced by reload!Úxr   Nz-WARNING: new-class {} not replaced by reload!r0   z  (fixing   Ú__file__Z
__bundle__é
   Ú.Fz   Rebuilt )1r   r	   Úhasattrr9   ÚRuntimeErrorr   r   Ústrr   Útwisted.pythonr:   ZALLOW_DUPLICATESr.   r    r!   ÚitemsÚ
issubclassr   r   r   r"   ÚlogfileÚwriteÚflushÚ
isinstancer   ÚupdateÚ__contains__Úkeysr   Ú	linecacheÚ
clearcacher   r   r4   r*   Úclearr7   Ú__getattr__ÚgcÚformatZget_referrersr0   ÚsysÚmodulesÚhashÚ	Exceptionr   Úsetattr)r$   ZdoLogr:   ÚdZ
newclassesÚclassesZ	functionsÚvaluesÚkÚvZfromOldModuleZclazzrT   ZnclassÚgaÚrZmodcountÚmkÚmodÚchangedÚnvr   r   r   Úrebuild}   sÄ    







ÿÿ



rf   )r8   )r   rP   rV   r   r   Ú	importlibr   r   Útypingr   rF   r   r   r	   r   r    ÚintÚ__annotations__r   r%   rY   r/   r1   r7   rf   r   r   r   r   Ú<module>   s"   %