a
    8g+                     @  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   v/var/www/vosh/data/www/fastworkle.ru/webshop-tgbot-v.1.0/venv/lib/python3.9/site-packages/sqlalchemy/event/registry.pyr   2   s   
)zweakref.ref[RefCollection[Any]]weakref.ref[_ListenerFnType]z6Dict[_EventKeyTupleType, _RefCollectionToListenerType]_key_to_collectionr    z>Dict[weakref.ref[RefCollection[Any]], _ListenerToEventKeyType]_collection_to_keyzweakref.ref[Any]None)refreturnc                 C  s^   t r| t vrd S td| } t | }| D ],}|tv r,t| }||  |s,t| q,d S )Nz'weakref.ref[RefCollection[EventTarget]])r"   r   popvaluesr!   )r$   listener_to_keykeydispatch_regr   r   r   _collection_gcedg   s    


r+   _EventKey[_ET]RefCollection[_ET]bool)	event_keyownerr%   c                 C  sH   | j }t| }|j}t| j}||v r,dS |||< t| }|||< dS )NFT)_keyr!   r$   weakref
_listen_fnr"   )r/   r0   r)   r*   	owner_ref
listen_refr(   r   r   r   _stored_in_collectionx   s    r6   c                 C  sV   | j }t| }t| j}|j}||d  |s6t|= |tv rRt| }||d  d S N)r1   r!   r2   r$   r3   r&   r"   )r/   r0   r)   r*   r5   r4   r(   r   r   r   _removed_from_collection   s    r8   zIterable[_ListenerFnType])newowneroldownerelementsr%   c              	   C  s   |sd S |j }| j }t| }t| }|D ]}t |}z|| }	W n tyX   Y q(Y n0 zt|	 }
W n ty|   Y q(Y n0 ||
v r|
| |ksJ n||
|< |	||< q(d S r7   )r$   r"   r2   KeyErrorr!   )r9   r:   r;   Zoldowner_refZnewowner_refZold_listener_to_keyZnew_listener_to_key	listen_fnr5   r)   r*   r   r   r   _stored_in_collection_multi   s(    


r>   )r0   r;   r%   c                 C  sT   |sd S | j }t| }|D ]4}t |}|| }t| }||d  |st|= qd S r7   )r$   r"   r2   r!   r&   )r0   r;   r4   r(   r=   r5   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   rA   strrB   _ListenerFnTyperC   _ListenerFnKeyTyperD   r   rF   zOptional[_ListenerFnType]_fn_wrapN)rA   rB   rC   rF   rJ   c                 C  sP   || _ || _|| _t|tjr6t|jt|jf| _	n
t|| _	|| _
|| _d S r7   )rA   rB   rC   
isinstancetypes
MethodTypeid__func____self__rD   rE   rF   )selfrA   rB   rC   rF   rJ   r   r   r   __init__   s    
z_EventKey.__init___EventKeyTupleType)r%   c                 C  s   t | j| j| jfS r7   )rN   rA   rB   rD   rQ   r   r   r   r1      s    z_EventKey._keyr,   )rE   r%   c                 C  s,   || j u r| S t| j| j| j| j|dS d S N)rJ   )r3   r@   rA   rB   rC   rF   )rQ   rE   r   r   r   with_wrapper  s    
z_EventKey.with_wrapper)rF   r%   c                 C  s,   || j u r| S t| j| j| j|| jdS d S rU   )rF   r@   rA   rB   rC   rE   )rQ   rF   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|i | n| jjj| g|R i | d S )NonceFZ_once_unless_exceptionnamed_sa_warn)retry_on_exception)r&   rF   rB   r3   getattrr   Z_adjust_fn_specrV   Z_eventshasattrr\   r   Z	only_oncelistenZ_listen)rQ   rX   rY   rZ   Zonce_unless_exceptionr[   rA   rB   rC   dispatch_collectionZadjusted_fnZstub_functionr   r   r   r`     s4    


z_EventKey.listenc                 C  st   | j }|tvr(td| j| j| jf t|}| D ]4\}}| }| }|d ur:|d ur:|	| 
| q:d S )Nz*No listeners found for event %s / %r / %s )r1   r!   r   ZInvalidRequestErrorrA   rB   rC   r&   itemsremoverV   )rQ   r)   r*   Zcollection_refZlistener_refZ
collectionZlistener_fnr   r   r   rc   <  s    
z_EventKey.remover.   c                 C  s
   | j tv S )z6Return True if this event key is registered to listen.)r1   r!   rT   r   r   r   containsM  s    z_EventKey.containsFzOptional[bool])	propagateinsertr[   retvalasyncior%   c           
      C  sT   | j | j }}t|j|}||j}	|r2|	  |rD|	| | n|	| | d S r7   )rF   rB   r^   r   
for_modifyZ_set_asynciorf   append)
rQ   re   rf   r[   rg   rh   rA   rB   ra   ri   r   r   r   base_listenQ  s    z_EventKey.base_listenc                 C  s   | j p
| jS r7   )rE   rC   rT   r   r   r   r3   f  s    z_EventKey._listen_fnr-   zDeque[_ListenerFnType])r0   list_r%   c                 C  s"   t | |r|| j dS dS d S NTF)r6   rj   r3   rQ   r0   rl   r   r   r   append_to_listj  s    
z_EventKey.append_to_listc                 C  s   t | | || j d S r7   )r8   rc   r3   rn   r   r   r   remove_from_listu  s    
z_EventKey.remove_from_listc                 C  s"   t | |r|| j dS dS d S rm   )r6   
appendleftr3   rn   r   r   r   prepend_to_list}  s    
z_EventKey.prepend_to_list)N)FFFNF)r   r   r   r   r   r   rR   propertyr1   rV   rW   r`   rc   rd   rk   r3   ro   rp   rr   r   r   r   r   r@      s8   
	       r@   ).r   
__future__r   collectionsrL   typingr   r   r   r   r   r   r	   r
   r   r   r   r2    r   r   TYPE_CHECKINGattrr   baser   rH   intrI   rG   rS   r   r   Z_RefCollectionToListenerTypedefaultdictdictr!   r   Z_ListenerToEventKeyTyper"   r+   r6   r8   r>   r?   r@   r   r   r   r   <module>   sX   	

$