B
    f+                 @  s  U 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 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 ddlmZ ddlmZ ddlmZ ddlmZ ddlZddlmZ ddlmZ ejrddlmZ ddlmZ edef Zeeeeef f Zeeeef ZedddZG dd dZ e
d Z!e"e#Z$de%d< e
def Z&e"e#Z'de%d< d d!d"d#d$Z(d%d&d'd(d)d*Z)d%d&d!d(d+d,Z*d&d&d-d!d.d/d0Z+d&d-d!d1d2d3Z,G d4d5 d5ee Z-dS )6aJ  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`.

    )annotationsN)Any)Callable)cast)Deque)Dict)Generic)Iterable)Optional)Tuple)TypeVar)Union   )exc)util   )RefCollection)
dispatcher._ETEventTarget)boundc               @  s   e Zd ZU dZdZded< dS )r   zrepresents an event target, that is, something we can listen on
    either with that target as a class or as an instance.

    Examples include:  Connection, Mapper, Table, Session,
    InstrumentedAttribute, Engine, Pool, Dialect.

     zdispatcher[Any]dispatchN)__name__
__module____qualname____doc__	__slots____annotations__r   r   r   [C:\Users\Lenovo\AppData\Local\Temp\pip-unpacked-wheel-4nia5yor\sqlalchemy\event\registry.pyr   2   s   
)zweakref.ref[RefCollection[Any]]zweakref.ref[_ListenerFnType]z6Dict[_EventKeyTupleType, _RefCollectionToListenerType]_key_to_collectionzweakref.ref[_ListenerFnType]z>Dict[weakref.ref[RefCollection[Any]], _ListenerToEventKeyType]_collection_to_keyzweakref.ref[Any]None)refreturnc             C  sb   t r| t krd S td| } t | }x8| D ],}|tkr.t| }||  |s.t| q.W d S )Nz'weakref.ref[RefCollection[EventTarget]])r!   r   popvaluesr    )r#   listener_to_keykeydispatch_regr   r   r   _collection_gcedg   s    


r*   z_EventKey[_ET]zRefCollection[_ET]bool)	event_keyownerr$   c             C  sH   | j }t| }|j}t| j}||kr,dS |||< t| }|||< dS )NFT)_keyr    r#   weakref
_listen_fnr!   )r,   r-   r(   r)   	owner_ref
listen_refr'   r   r   r   _stored_in_collectionx   s    r3   c             C  sT   | j }t| }t| j}|j}||d  |s6t|= |tkrPt| }|| d S )N)r.   r    r/   r#   r0   r%   r!   )r,   r-   r(   r)   r2   r1   r'   r   r   r   _removed_from_collection   s    r4   zIterable[_ListenerFnType])newowneroldownerelementsr$   c          	   C  s   |sd S |j }| j }t| }t| }x|D ]}t |}y|| }	W n tk
rZ   w*Y nX yt|	 }
W n tk
r~   w*Y nX ||
kr|
| |kstn||
|< |	||< q*W d S )N)r#   r!   r/   KeyErrorr    AssertionError)r5   r6   r7   Zoldowner_refZnewowner_refZold_listener_to_keyZnew_listener_to_key	listen_fnr2   r(   r)   r   r   r   _stored_in_collection_multi   s(    

r;   )r-   r7   r$   c             C  sX   |sd S | j }t| }x<|D ]4}t |}|| }t| }||d  |st|= qW d S )N)r#   r!   r/   r    r%   )r-   r7   r1   r'   r:   r2   r(   r)   r   r   r   _clear   s    

r<   c               @  s   e Zd ZU dZdZded< ded< ded< d	ed
< ded< ded< d7ddddddddZeddddZdddddZ	dddddZ
ddddd d!Zddd"d#Zd$dd%d&Zd8d$d$d$d(d$dd)d*d+Zeddd,d-Zd.d/d$d0d1d2Zd.d/dd0d3d4Zd.d/d$d0d5d6ZdS )9	_EventKeyz$Represent :func:`.listen` arguments.)target
identifierfnfn_keyfn_wrapdispatch_targetr   r>   strr?   _ListenerFnTyper@   _ListenerFnKeyTyperA   r   rC   zOptional[_ListenerFnType]_fn_wrapN)r>   r?   r@   rC   rG   c             C  sP   || _ || _|| _t|tjr6t|jt|jf| _	n
t|| _	|| _
|| _d S )N)r>   r?   r@   
isinstancetypes
MethodTypeid__func____self__rA   rB   rC   )selfr>   r?   r@   rC   rG   r   r   r   __init__   s    
z_EventKey.__init___EventKeyTupleType)r$   c             C  s   t | j| j| jfS )N)rK   r>   r?   rA   )rN   r   r   r   r.      s    z_EventKey._keyz_EventKey[_ET])rB   r$   c             C  s,   || j kr| S t| j| j| j| j|dS d S )N)rG   )r0   r=   r>   r?   r@   rC   )rN   rB   r   r   r   with_wrapper   s    
z_EventKey.with_wrapper)rC   r$   c             C  s,   || j kr| S t| j| j| j|| jdS d S )N)rG   )rC   r=   r>   r?   r@   rB   )rN   rC   r   r   r   with_dispatch_target  s    
z_EventKey.with_dispatch_targetr"   )argskwr$   c             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)retry_on_exception)r%   rC   r?   r0   getattrr   Z_adjust_fn_specrQ   Z_eventshasattrrW   r   Z	only_oncelistenZ_listen)rN   rS   rT   rU   Zonce_unless_exceptionrV   r>   r?   r@   dispatch_collectionZadjusted_fnZstub_functionr   r   r   r[     s&    


z_EventKey.listenc             C  sx   | j }|tkr(td| j| j| jf t|}x@| D ]4\}}| }| }|d k	r<|d k	r<|	| 
| q<W d S )Nz*No listeners found for event %s / %r / %s )r.   r    r   ZInvalidRequestErrorr>   r?   r@   r%   itemsremoverQ   )rN   r(   r)   Zcollection_refZlistener_refZ
collectionZlistener_fnr   r   r   r^   8  s    
z_EventKey.remover+   c             C  s
   | j tkS )z6Return True if this event key is registered to listen.)r.   r    )rN   r   r   r   containsI  s    z_EventKey.containsFzOptional[bool])	propagateinsertrV   retvalasyncior$   c       
      C  sT   | j | j }}t|j|}||j}	|r2|	  |rD|	| | n|	| | d S )N)rC   r?   rY   r   
for_modifyZ_set_asynciora   append)
rN   r`   ra   rV   rb   rc   r>   r?   r\   rd   r   r   r   base_listenM  s    z_EventKey.base_listenc             C  s   | j p
| jS )N)rB   r@   )rN   r   r   r   r0   b  s    z_EventKey._listen_fnzRefCollection[_ET]zDeque[_ListenerFnType])r-   list_r$   c             C  s"   t | |r|| j dS dS d S )NTF)r3   re   r0   )rN   r-   rg   r   r   r   append_to_listf  s    
z_EventKey.append_to_listc             C  s   t | | || j d S )N)r4   r^   r0   )rN   r-   rg   r   r   r   remove_from_listq  s    
z_EventKey.remove_from_listc             C  s"   t | |r|| j dS dS d S )NTF)r3   
appendleftr0   )rN   r-   rg   r   r   r   prepend_to_listy  s    
z_EventKey.prepend_to_list)N)FFFNF)r   r   r   r   r   r   rO   propertyr.   rQ   rR   r[   r^   r_   rf   r0   rh   ri   rk   r   r   r   r   r=      s0   
     r=   ).r   
__future__r   collectionsrI   typingr   r   r   r   r   r   r	   r
   r   r   r   r/    r   r   TYPE_CHECKINGattrr   baser   rE   intrF   rD   rP   r   r   Z_RefCollectionToListenerTypedefaultdictdictr    r   Z_ListenerToEventKeyTyper!   r*   r3   r4   r;   r<   r=   r   r   r   r   <module>   sN   $