o
    y¬´\¿  ã                   @   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 vrd S t  | ¡}| ¡ D ]}|tv r't| }| | ¡ |s't |¡ qd S ©N)Ú_collection_to_keyÚpopÚvaluesÚ_key_to_collection)ÚrefÚlistener_to_keyÚkeyÚdispatch_reg© r   úK/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/event/registry.pyÚ_collection_gced5   s   


€úr   c                 C   sH   | j }t| }|j}t | j¡}||v 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   sX   | j }t| }t | j¡}|j}| |d ¡ |st|= |tv r*t| }| |¡ d S 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   sv   |sd S |j }| j } t| }t|  }|D ]$}t  |¡}|| }t| }| |v r0||  |ks/J ‚n||| < |||< qd S r   )r   r   r   r
   )	ÚnewownerÚoldownerÚelementsÚold_listener_to_keyÚ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 ]}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ƒrt|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'   ©r0   r   r   r   r   ¥   s   z_EventKey._keyc                 C   s(   || j u r| S t| j| j| j| j|d�S ©N)r1   )r   r#   r$   r%   r&   r)   )r0   r(   r   r   r   Úwith_wrapper©   s   
ûz_EventKey.with_wrapperc                 C   s(   || j u r| S t| j| j| j|| jd�S r4   )r)   r#   r$   r%   r&   r(   )r0   r)   r   r   r   Úwith_dispatch_targetµ   s   
ûz_EventKey.with_dispatch_targetc           
      O   s–   |  dd¡}|  dd¡}| j| j| j}}}t|j|ƒ}| ||¡}	|  |	¡} |r;|  t 	| j¡¡j
|i |¤Ž d S | jjj| g|¢R i |¤Ž d S )NÚonceFÚnamed)r   r)   r%   r   ÚgetattrÚdispatchÚ_adjust_fn_specr5   r   Ú	only_onceÚlistenÚ_listen)
r0   ÚargsÚkwr7   r8   r$   r%   r&   Údispatch_collectionÚadjusted_fnr   r   r   r=   Á   s    
ý
ÿ
ÿ 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 )r   r
   r   ÚInvalidRequestErrorr$   r%   r&   r   ÚitemsÚremover5   )r0   r   r   Úcollection_refÚlistener_refÚ
collectionÚlistener_fnr   r   r   rE   Ø   s   ÿÿ
€üz_EventKey.removec                 C   s
   | j tv S )z?Return True if this event key is registered to listen.
        )r   r
   r3   r   r   r   Úcontainsè   s   
z_EventKey.containsFc                 C   sN   | j | j}}t|j|ƒ}|r| |j¡ | |¡ d S | |j¡ | |¡ d S r   )r)   r%   r9   r:   Ú
for_modifyÚinsertÚappend)r0   Ú	propagaterL   r8   Úretvalr$   r%   rA   r   r   r   Úbase_listení   s   ÿÿz_EventKey.base_listenc                 C   s   | j p| jS r   )r(   r&   r3   r   r   r   r   þ   s   z_EventKey._listen_fnc                 C   ó   t | |ƒr| | j¡ dS dS ©NTF)r   rM   r   ©r0   r   Úlist_r   r   r   Úappend_to_list  ó   
z_EventKey.append_to_listc                 C   s   t | |ƒ | | j¡ d S r   )r   rE   r   rS   r   r   r   Úremove_from_list	  s   
z_EventKey.remove_from_listc                 C   rQ   rR   )r   Ú
appendleftr   rS   r   r   r   Úprepend_to_list  rV   z_EventKey.prepend_to_listr   )FFFN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r2   Úpropertyr   r5   r6   r=   rE   rJ   rP   r   rU   rW   rY   r   r   r   r   r#   �   s$    
	

ÿ
r#   )r]   Ú
__future__r   Úcollectionsr+   r   Ú r   r   ÚdefaultdictÚdictr
   r   r   r   r   r!   r"   Úobjectr#   r   r   r   r   Ú<module>   s"   


