o
    [h%                      @   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   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/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
   )	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 ]}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#   r,   r   r   r   r      s   z_EventKey._keyc                 C   s(   || j u r| S t| j| j| j| j|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 u r| S t| j| j| j|| jdS r0   )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@|
  |sD|rW| tj| j|dj|i | d S | jjj| g|R i | d S )NonceFZ_once_unless_exceptionnamed_sa_warn)Zretry_on_exception)r   r%   r!   r   getattrdispatchZ_adjust_fn_specr1   Z_eventshasattrr5   r   Z	only_oncelistenZ_listen)r,   argskwr3   Zonce_unless_exceptionr4   r    r!   r"   dispatch_collectionZadjusted_fnZstub_functionr   r   r   r9      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 )r   r
   r   ZInvalidRequestErrorr    r!   r"   r   itemsremover1   )r,   r   r   Zcollection_refZlistener_refZ
collectionZlistener_fnr   r   r   r>      s   
z_EventKey.removec                 C   s
   | j tv S )z6Return True if this event key is registered to listen.)r   r
   r/   r   r   r   contains   s   
z_EventKey.containsFc                 C   sN   | j | j}}t|j|}|r||j| | d S ||j| | d S r   )r%   r!   r6   r7   Z
for_modifyinsertappend)r,   	propagater@   r4   retvalr    r!   r<   r   r   r   base_listen   s   z_EventKey.base_listenc                 C   s   | j p| jS r   )r$   r"   r/   r   r   r   r     s   z_EventKey._listen_fnc                 C      t | |r|| j dS dS NTF)r   rA   r   r,   r   list_r   r   r   append_to_list	     
z_EventKey.append_to_listc                 C   s   t | | || j d S r   )r   r>   r   rG   r   r   r   remove_from_list  s   
z_EventKey.remove_from_listc                 C   rE   rF   )r   
appendleftr   rG   r   r   r   prepend_to_list  rJ   z_EventKey.prepend_to_listr   )FFFN)__name__
__module____qualname____doc__	__slots__r.   propertyr   r1   r2   r9   r>   r?   rD   r   rI   rK   rM   r   r   r   r   r      s$    
	
 

r   )rQ   
__future__r   collectionsr'   r    r   r   defaultdictdictr
   r   r   r   r   r   r   objectr   r   r   r   r   <module>   s"   


