U
    ÌZj&!  ã                   @   s�   d Z ddlmZ ddlZddlZddlZddlmZ ddlmZ e 	e
¡Ze 	e
¡Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZdS )aJ  Provides managed registration services on behalf of :func:`.listen`
arguments.

By "managed registration", we mean that event listening functions and
other objects can be added to various collections in such a way that their
membership in all those collections can be revoked at once, based on
an equivalent :class:`._EventKey`.

é    )Úabsolute_importNé   )Úexc)Úutilc                 C   sT   t r| t krd S t  | ¡}| ¡ D ],}|tkr"t| }| | ¡ |s"t |¡ q"d S ©N)Ú_collection_to_keyÚpopÚvaluesÚ_key_to_collection)ÚrefÚlistener_to_keyÚkeyÚdispatch_reg© r   ú\/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/sqlalchemy/event/registry.pyÚ_collection_gced5   s    

r   c                 C   sH   | j }t| }|j}t | j¡}||kr,dS |||< t| }|||< dS )NFT)Ú_keyr
   r   ÚweakrefÚ
_listen_fnr   )Ú	event_keyÚownerr   r   Ú	owner_refÚ
listen_refr   r   r   r   Ú_stored_in_collectionC   s    r   c                 C   sT   | j }t| }t | j¡}|j}| |d ¡ |s6t|= |tkrPt| }| |¡ d S r   )r   r
   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   Ú_removed_from_collectionV   s    r   c           	   	   C   s²   |sd S |j }| j } t| }t|  }|D ]„}t  |¡}z|| }W n tk
rZ   Y q(Y nX zt| }W n tk
r€   Y q(Y nX | |krœ||  |ks¤t‚n||| < |||< q(d S r   )r   r   r   ÚKeyErrorr
   ÚAssertionError)	ZnewownerZoldownerÚelementsZold_listener_to_keyZnew_listener_to_keyÚ	listen_fnr   r   r   r   r   r   Ú_stored_in_collection_multig   s(    


r   c                 C   sT   |sd S | j } t|  }|D ]4}t  |¡}|| }t| }| | d ¡ |st|= qd S r   )r   r   r   r
   r   )r   r   r   r   r   r   r   r   r   r   Ú_clear‡   s    
r    c                   @   s€   e Zd ZdZdZddd„Zedd„ ƒZdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ Zddd„Zedd„ ƒZdd„ Zdd„ Zdd„ ZdS )Ú	_EventKeyz$Represent :func:`.listen` arguments.)ÚtargetÚ
identifierÚfnÚfn_keyÚfn_wrapÚdispatch_targetNc                 C   sP   || _ || _|| _t|tjƒr6t|jƒt|jƒf| _	n
t|ƒ| _	|| _
|| _d S r   )r"   r#   r$   Ú
isinstanceÚtypesÚ
MethodTypeÚidÚ__func__Ú__self__r%   r&   r'   )Úselfr"   r#   r$   r'   Ú_fn_wrapr   r   r   Ú__init__£   s    
z_EventKey.__init__c                 C   s   t | jƒ| j| jfS r   )r+   r"   r#   r%   ©r.   r   r   r   r   ®   s    z_EventKey._keyc                 C   s,   || j kr| S t| j| j| j| j|d�S d S ©N)r/   )r   r!   r"   r#   r$   r'   )r.   r&   r   r   r   Úwith_wrapper²   s    
ûz_EventKey.with_wrapperc                 C   s,   || j kr| S t| j| j| j|| jd�S d S r2   )r'   r!   r"   r#   r$   r&   )r.   r'   r   r   r   Úwith_dispatch_target¾   s    
ûz_EventKey.with_dispatch_targetc                 O   sÂ   |  dd¡}|  dd¡}|  dd¡}| j| j| j  }}}t|j|ƒ}	|	 ||¡}
|  |
¡} t| jjj| jƒ}t	|dƒr€| 
¡  |sˆ|r¨|  tj| j|d�¡j||Ž n| jjj| f|ž|Ž d S )NÚonceFZ_once_unless_exceptionÚnamedÚ_sa_warn)Zretry_on_exception)r   r'   r#   r   ÚgetattrÚdispatchZ_adjust_fn_specr3   Z_eventsÚhasattrr7   r   Z	only_onceÚlistenZ_listen)r.   ÚargsÚkwr5   Zonce_unless_exceptionr6   r"   r#   r$   Údispatch_collectionZadjusted_fnZstub_functionr   r   r   r;   Ê   s6    ý

 ÿ
 ÿÿ üz_EventKey.listenc                 C   st   | j }|tkr(t d| j| j| jf ¡‚t |¡}| ¡ D ]4\}}|ƒ }|ƒ }|d k	r:|d k	r:| 	|  
|¡¡ q:d S )Nz*No listeners found for event %s / %r / %s )r   r
   r   ZInvalidRequestErrorr"   r#   r$   r   ÚitemsÚremover3   )r.   r   r   Zcollection_refZlistener_refZ
collectionZlistener_fnr   r   r   r@   ê   s    ÿÿ
z_EventKey.removec                 C   s
   | j tkS )z6Return True if this event key is registered to listen.)r   r
   r1   r   r   r   Úcontainsû   s    z_EventKey.containsFc           
      C   sT   | j | j }}t|j|ƒ}| |j¡}	|r2|	 ¡  |rD|	 | |¡ n|	 | |¡ d S r   )r'   r#   r8   r9   Ú
for_modifyZ_set_asyncioÚinsertÚappend)
r.   Ú	propagaterC   r6   ÚretvalZasyncior"   r#   r>   rB   r   r   r   Úbase_listenÿ   s    	z_EventKey.base_listenc                 C   s   | j p
| jS r   )r&   r$   r1   r   r   r   r     s    z_EventKey._listen_fnc                 C   s"   t | |ƒr| | j¡ dS dS d S ©NTF)r   rD   r   ©r.   r   Úlist_r   r   r   Úappend_to_list  s    
z_EventKey.append_to_listc                 C   s   t | |ƒ | | j¡ d S r   )r   r@   r   rI   r   r   r   Úremove_from_list   s    
z_EventKey.remove_from_listc                 C   s"   t | |ƒr| | j¡ dS dS d S rH   )r   Ú
appendleftr   rI   r   r   r   Úprepend_to_list$  s    
z_EventKey.prepend_to_list)N)FFFNF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r0   Úpropertyr   r3   r4   r;   r@   rA   rG   r   rK   rL   rN   r   r   r   r   r!   —   s*   	

      ú

r!   )rR   Ú
__future__r   Úcollectionsr)   r   Ú r   r   ÚdefaultdictÚdictr
   r   r   r   r   r   r    Úobjectr!   r   r   r   r   Ú<module>   s   


 