o
    Šå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rvd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< 	 d9d$d%„Z(d:d+d,„Z)d;d-d.„Z*d<d3d4„Z+d=d5d6„Z,G d7d8„ d8e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`.

é    )Ú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   zírepresents 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   úU/var/www/html/flaskapp/venv/lib/python3.10/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_keyÚrefúweakref.ref[Any]ÚreturnÚNonec                 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,   Ú	event_keyú_EventKey[_ET]ÚownerúRefCollection[_ET]Úboolc                 C  sH   | j }t| }|j}t | j¡}||v 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   r7   c                 C  sZ   | j }t| }t | j¡}|j}| |d ¡ |st|= |tv r+t| }| |d ¡ d S d S ©N)r2   r!   r3   r#   r4   r'   r"   )r-   r/   r*   r+   r6   r5   r)   r   r   r   Ú_removed_from_collection�   s   úr9   ÚnewownerÚoldownerÚelementsúIterable[_ListenerFnType]c              	   C  s¦   |sd S |j }| j }t| }t| }|D ]<}t  |¡}z|| }	W n	 ty*   Y qw zt|	 }
W n	 ty:   Y qw ||
v rH|
| |ksGJ ‚n||
|< |	||< qd S r8   )r#   r"   r3   ÚKeyErrorr!   )r:   r;   r<   Úoldowner_refÚnewowner_refÚold_listener_to_keyÚnew_listener_to_keyÚ	listen_fnr6   r*   r+   r   r   r   Ú_stored_in_collection_multi¤   s.   
ýÿ
írD   c                 C  sT   |sd S | j }t| }|D ]}t  |¡}|| }t| }| |d ¡ |s't|= qd S r8   )r#   r"   r3   r!   r'   )r/   r<   r5   r)   rC   r6   r*   r+   r   r   r   Ú_clearÈ   s   
€ùrE   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< 	d;d<dd„Zed=dd„ƒZd>dd„Z	d?dd„Z
d@dd „ZdAd!d"„ZdBd$d%„Z	&	&	&		&dCdDd-d.„ZedEd/d0„ƒZdFd5d6„ZdGd7d8„ZdFd9d:„ZdS )HÚ	_EventKeyz$Represent :func:`.listen` arguments.)ÚtargetÚ
identifierÚfnÚfn_keyÚfn_wrapÚdispatch_targetr   rG   ÚstrrH   Ú_ListenerFnTyperI   Ú_ListenerFnKeyTyperJ   r   rL   úOptional[_ListenerFnType]Ú_fn_wrapNc                 C  sP   || _ || _|| _t|tjƒrt|jƒt|jƒf| _	nt|ƒ| _	|| _
|| _d S r8   )rG   rH   rI   Ú
isinstanceÚtypesÚ
MethodTypeÚidÚ__func__Ú__self__rJ   rK   rL   )ÚselfrG   rH   rI   rL   rQ   r   r   r   Ú__init__î   s   

z_EventKey.__init__r%   Ú_EventKeyTupleTypec                 C  s   t | jƒ| j| jfS r8   )rU   rG   rH   rJ   ©rX   r   r   r   r2      s   z_EventKey._keyrK   r.   c                 C  s(   || j u r| S t| j| j| j| j|d�S ©N)rQ   )r4   rF   rG   rH   rI   rL   )rX   rK   r   r   r   Úwith_wrapper  s   
ûz_EventKey.with_wrapperc                 C  s(   || j u r| S t| j| j| j|| jd�S r\   )rL   rF   rG   rH   rI   rK   )rX   rL   r   r   r   Úwith_dispatch_target  s   
ûz_EventKey.with_dispatch_targetÚargsÚkwr&   c                 O  sÎ   |  dd¡}|  dd¡}|  dd¡}| j| j| j}}}t|j|ƒ}	|	 ||¡}
|  |
¡} t| jjj| jƒ}t	|dƒr@| 
¡  |sD|rW|  tj| j|d�¡j|i |¤Ž d S | jjj| g|¢R i |¤Ž d S )NÚonceFÚ_once_unless_exceptionÚnamedÚ_sa_warn)Úretry_on_exception)r'   rL   rH   r4   Úgetattrr   Ú_adjust_fn_specr]   Ú_eventsÚhasattrrd   r   Ú	only_onceÚlistenÚ_listen)rX   r_   r`   ra   Úonce_unless_exceptionrc   rG   rH   rI   Údispatch_collectionÚadjusted_fnÚstub_functionr   r   r   rk     s4   
ý
ÿ
ÿÿü
ü z_EventKey.listenc                 C  st   | j }|tvrt d| j| j| jf ¡‚t |¡}| ¡ D ]\}}|ƒ }|ƒ }|d ur7|d ur7| 	|  
|¡¡ qd S )Nz*No listeners found for event %s / %r / %s )r2   r!   r   ÚInvalidRequestErrorrG   rH   rI   r'   ÚitemsÚremover]   )rX   r*   r+   Úcollection_refÚlistener_refÚ
collectionÚlistener_fnr   r   r   rs   <  s   ÿÿ
€üz_EventKey.remover1   c                 C  s
   | j tv S )z6Return True if this event key is registered to listen.)r2   r!   r[   r   r   r   ÚcontainsM  s   
z_EventKey.containsFÚ	propagateÚinsertrc   ÚretvalúOptional[bool]Úasyncioc           
      C  sV   | j | j}}t|j|ƒ}| |j¡}	|r|	 ¡  |r#|	 | |¡ d S |	 | |¡ d S r8   )rL   rH   rf   r   Ú
for_modifyÚ_set_asynciorz   Úappend)
rX   ry   rz   rc   r{   r}   rG   rH   rn   r~   r   r   r   Úbase_listenQ  s   z_EventKey.base_listenc                 C  s   | j p| jS r8   )rK   rI   r[   r   r   r   r4   f  s   z_EventKey._listen_fnr/   r0   Úlist_úDeque[_ListenerFnType]c                 C  ó   t | |ƒr| | j¡ dS dS ©NTF)r7   r€   r4   ©rX   r/   r‚   r   r   r   Úappend_to_listj  ó   
z_EventKey.append_to_listc                 C  s   t | |ƒ | | j¡ d S r8   )r9   rs   r4   r†   r   r   r   Úremove_from_listu  s   
z_EventKey.remove_from_listc                 C  r„   r…   )r7   Ú
appendleftr4   r†   r   r   r   Úprepend_to_list}  rˆ   z_EventKey.prepend_to_listr8   )
rG   r   rH   rM   rI   rN   rL   r   rQ   rP   )r%   rZ   )rK   rN   r%   r.   )rL   r   r%   r.   )r_   r   r`   r   r%   r&   )r%   r&   )r%   r1   )FFFNF)ry   r1   rz   r1   rc   r1   r{   r|   r}   r1   r%   r&   )r%   rN   )r/   r0   r‚   rƒ   r%   r1   )r/   r0   r‚   rƒ   r%   r&   )r   r   r   r   r   r   rY   Úpropertyr2   r]   r^   rk   rs   rx   r�   r4   r‡   r‰   r‹   r   r   r   r   rF   Û   s:   
 	ú



 
ú

rF   )r#   r$   r%   r&   )r-   r.   r/   r0   r%   r1   )r-   r.   r/   r0   r%   r&   )r:   r0   r;   r0   r<   r=   r%   r&   )r/   r0   r<   r=   r%   r&   ).r   Ú
__future__r   ÚcollectionsrS   Útypingr   r   r   r   r   r   r	   r
   r   r   r   r3   Ú r   r   ÚTYPE_CHECKINGÚattrr   Úbaser   rN   ÚintrO   rM   rZ   r   r   Ú_RefCollectionToListenerTypeÚdefaultdictÚdictr!   r   Ú_ListenerToEventKeyTyper"   r,   r7   r9   rD   rE   rF   r   r   r   r   Ú<module>   s^   	ÿ
ÿÿÿ
ý




$