o znh3 @sdZddlmZddlZddlZddlZddlmZddlmZe e Z e e Z ddZ d d Zd d Zd dZddZGdddeZdS)aJProvides 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)utilcCsTtr|tvrdSt|}|D]}|tvr't|}|||s't|qdSN)_collection_to_keypopvalues_key_to_collection)reflistener_to_keykey dispatch_regrD/usr/local/lib/python3.10/dist-packages/sqlalchemy/event/registry.py_collection_gced5s     rcCsH|j}t|}|j}t|j}||vrdS|||<t|}|||<dS)NFT)_keyr r weakref _listen_fnr) event_keyownerr r owner_ref listen_refr rrr_stored_in_collectionCs rcCsX|j}t|}t|j}|j}||d|st|=|tvr*t|}||dSdSr)rr rr rrr)rrr rrrr rrr_removed_from_collectionVs  rc Csv|sdS|j}|j}t|}t|}|D]$}t|}||}t|}||vr0|||ks/Jn|||<|||<qdSr)r rrr ) newowneroldownerelementsold_listener_to_keynew_listener_to_key listen_fnrr rrrr_stored_in_collection_multigs  r!cCsT|sdS|j}t|}|D]}t|}||}t|}||d|s't|=q dSr)r rrr r)rrr r rr rrrr_clear}s  r"c@seZdZdZdZdddZeddZdd Zd d Z d d Z ddZ ddZ dddZ eddZddZddZddZdS) _EventKeyz)Represent :func:`.listen` arguments. )target identifierfnfn_keyfn_wrapdispatch_targetNcCsP||_||_||_t|tjrt|jt|jf|_ nt||_ ||_ ||_ dSr) r$r%r& isinstancetypes MethodTypeid__func____self__r'r(r))selfr$r%r&r)_fn_wraprrr__init__s   z_EventKey.__init__cCst|j|j|jfSr)r-r$r%r'r0rrrrsz_EventKey._keycCs(||jur|St|j|j|j|j|dSN)r1)rr#r$r%r&r))r0r(rrr with_wrappers z_EventKey.with_wrappercCs(||jur|St|j|j|j||jdSr4)r)r#r$r%r&r()r0r)rrrwith_dispatch_targets z_EventKey.with_dispatch_targetc Os|dd}|dd}|dd}|j|j|j}}}t|j|} | ||} || }t|jjj|j} t | dr@| |sD|rW|t j |j|dj |i|dS|jjj|g|Ri|dS)NonceF_once_unless_exceptionnamed_sa_warn)retry_on_exception)rr)r%rgetattrdispatch_adjust_fn_specr5_eventshasattrr:r only_oncelisten_listen) r0argskwr7once_unless_exceptionr9r$r%r&dispatch_collection adjusted_fn stub_functionrrrrBs4         z_EventKey.listencCst|j}|tvrtd|j|j|jft|}|D]\}}|}|}|dur7|dur7| | |qdS)Nz*No listeners found for event %s / %r / %s ) rr rInvalidRequestErrorr$r%r&ritemsremover5)r0r rcollection_ref listener_ref collection listener_fnrrrrLs z_EventKey.removecCs |jtvS)z?Return True if this event key is registered to listen. )rr r3rrrcontainss z_EventKey.containsFcCsN|j|j}}t|j|}|r||j||dS||j||dSr)r)r%r<r= for_modifyinsertappend)r0 propagaterSr9retvalr$r%rGrrr base_listens   z_EventKey.base_listencCs |jp|jSr)r(r&r3rrrrs z_EventKey._listen_fncCt||r ||jdSdSNTF)rrTrr0rlist_rrrappend_to_list   z_EventKey.append_to_listcCst||||jdSr)rrLrrZrrrremove_from_lists z_EventKey.remove_from_listcCrXrY)r appendleftrrZrrrprepend_to_listr]z_EventKey.prepend_to_listr)FFFN)__name__ __module__ __qualname____doc__ __slots__r2propertyrr5r6rBrLrQrWrr\r^r`rrrrr#s$        r#)rd __future__r collectionsr+rrr defaultdictdictr rrrrr!r"objectr#rrrrs"