
    ؄_%                          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j	        e
          Z	  ej	        e
          Z	 d Zd Zd	 Zd
 Zd Z G 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                    t           r	| t           vrd S t                               |           }|                                D ]I}|t          v r>t          |         }|                    |            |st                              |           Jd S N)_collection_to_keypopvalues_key_to_collection)reflistener_to_keykeydispatch_regs       ^/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/sqlalchemy/event/registry.py_collection_gcedr   5   s     ,>!>!>(,,S11O%%'' , ,$$$-c2LS!!! ,"&&s+++, ,    c                     | j         }t          |         }|j        }t          j        | j                  }||v rdS |||<   t
          |         }|||<   dS )NFT)_keyr   r   weakref
_listen_fnr	   )	event_keyownerr   r   	owner_ref
listen_refr   s          r   _stored_in_collectionr   C   s_    
.C%c*L	IY122JL  u(L(3O"%OJ4r   c                    | j         }t          |         }t          j        | 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   s          r   _removed_from_collectionr   V   s    
.C%c*LY122J	IY%%% $s#&&&,Y7J''''' '&r   c                     |sd S |j         }| j         } t          |         }t          |          }|D ]H}t          j         |          }||         }t          |         }| |v r||          |k    sJ n||| <   |||<   Id S r   )r   r	   r   r   )	newowneroldownerelementsold_listener_to_keynew_listener_to_key	listen_fnr   r   r   s	            r   _stored_in_collection_multir&   g   s     |H|H,X6,X6 	. 	.	[++
!*-)#.|##)Z77777%/L"*-J''	. 	.r   c                     |sd S | j         } t          |          }|D ]K}t          j         |          }||         }t          |         }|                    | d            |st          |= Ld S r   )r   r	   r   r   r
   )r   r"   r   r%   r   r   r   s          r   _clearr(   }   s     IE(/O ( (	[++
j))#.%%% 	("3'( (r   c                       e Zd ZdZdZddZed             Zd Zd Z	d Z
d	 Zd
 Z	 ddZed             Zd Zd Zd ZdS )	_EventKeyz$Represent :func:`.listen` arguments.)target
identifierfnfn_keyfn_wrapdispatch_targetNc                    || _         || _        || _        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/   r0   )selfr+   r,   r-   r0   _fn_wraps         r   __init__z_EventKey.__init__   sl    $b%*++ 	!R[//2bk??:DKKR&&DK.r   c                 D    t          | j                  | j        | j        fS r   )r5   r+   r,   r.   r8   s    r   r   z_EventKey._key   s    4;$+>>r   c                 h    || j         u r| S t          | j        | j        | j        | j        |          S N)r9   )r   r*   r+   r,   r-   r0   )r8   r/   s     r   with_wrapperz_EventKey.with_wrapper   sC    do%%K$    r   c                 h    || j         u r| S t          | j        | j        | j        || j                  S r>   )r0   r*   r+   r,   r-   r/   )r8   r0   s     r   with_dispatch_targetz_EventKey.with_dispatch_target   sC    d222K   r   c                 x   |                     dd          }|                     dd          }|                     dd          }| j        | j        | j        }}}t	          |j        |          }	|	                    ||          }
|                     |
          } t	          | j        j        j        | j                  }t          |d          r|
                                 |s|r; |                     t          j        | j        |                    j        |i | d S  | j        j        j        | g|R i | d S )NonceF_once_unless_exceptionnamed_sa_warn)retry_on_exception)r
   r0   r,   r   getattrdispatch_adjust_fn_specr?   _eventshasattrrF   r   	only_oncelisten_listen)r8   argskwrC   once_unless_exceptionrE   r+   r,   r-   dispatch_collectionadjusted_fnstub_functions               r   rN   z_EventKey.listen   sy   vvfe$$ "'? G Gw&&  OO 
 &fozBB)99"eDD  -- )14?
 
 =*-- 	%""$$$ 	E( 	EDO8M    d	" !	" " " " " 2D )1$DDDDDDDDDr   c           	      h   | j         }|t          vr-t          j        d| j        d| j        d| j        d          t                              |          }|                                D ]E\  }} |            } |            }|*|(|	                    | 
                    |                     Fd S )NzNo listeners found for event z /  )r   r   r   InvalidRequestErrorr+   r,   r-   r
   itemsremover?   )r8   r   r   collection_reflistener_ref
collectionlistener_fns          r   rZ   z_EventKey.remove   s    i((());;;:   *--c22,8,>,>,@,@ 	B 	B(NL'))J&,..K%+*A!!$"3"3K"@"@AAA		B 	Br   c                     | j         t          v S )z6Return True if this event key is registered to listen.)r   r   r<   s    r   containsz_EventKey.contains   s    y...r   Fc                    | j         | j        }}t          |j        |          }|r0|                    |j                                      | |           d S |                    |j                                      | |           d S r   )r0   r,   rH   rI   
for_modifyinsertappend)r8   	propagaterc   rE   retvalr+   r,   rS   s           r   base_listenz_EventKey.base_listen   s     "14?
%fozBB 	**6?;;BBi      **6?;;BBi    r   c                     | j         p| j        S r   )r/   r-   r<   s    r   r   z_EventKey._listen_fn  s    |&tw&r   c                 ^    t          | |          r|                    | j                   dS dS NTF)r   rd   r   r8   r   list_s      r   append_to_listz_EventKey.append_to_list	  s2     u-- 	LL)))45r   c                 Z    t          | |           |                    | j                   d S r   )r   rZ   r   rk   s      r   remove_from_listz_EventKey.remove_from_list  s,     u---T_%%%%%r   c                 ^    t          | |          r|                    | j                   dS dS rj   )r   
appendleftr   rk   s      r   prepend_to_listz_EventKey.prepend_to_list  s4     u-- 	T_---45r   r   )FFFN)__name__
__module____qualname____doc__	__slots__r:   propertyr   r?   rA   rN   rZ   r`   rg   r   rm   ro   rr    r   r   r*   r*      s       ..I	/ 	/ 	/ 	/ ? ? X?
 
 

 
 
E E E@B B B / / /
 BF   " ' ' X'  & & &    r   r*   )rv   
__future__r   collectionsr3   r    r   r   defaultdictdictr   r	   r   r   r   r&   r(   objectr*   ry   r   r   <module>r      s"    ' & & & & &                   -[,T22 	 -[,T22 	, , ,  &( ( (". . .,( ( ( L L L L L L L L L Lr   