U aO"@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 |tkrdSt|}|D],}|tkr"t|}|||s"t|q"dSN)_collection_to_keypopvalues_key_to_collection)reflistener_to_keykey dispatch_regrZC:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-nyjtotrf\sqlalchemy\event\registry.py_collection_gced5s    rcCsH|j}t|}|j}t|j}||kr,dS|||<t|}|||<dS)NFT)_keyr r weakref _listen_fnr) event_keyownerr r owner_ref listen_refr rrr_stored_in_collectionCs rcCsT|j}t|}t|j}|j}||d|s6t|=|tkrPt|}||dSr)rr rr rrr)rrr rrrr rrr_removed_from_collectionVs  rc Cs|sdS|j}|j}t|}t|}|D]}t|}z ||}Wntk rZYq(YnXz t|}Wntk rYq(YnX||kr|||kstn|||<|||<q(dSr)r rrKeyErrorr AssertionError) ZnewownerZoldownerelementsZold_listener_to_keyZnew_listener_to_key listen_fnrr rrrr_stored_in_collection_multigs(     rcCsT|sdS|j}t|}|D]4}t|}||}t|}||d|st|=qdSr)r rrr r)rrr rrr rrrr_clears  r c@seZdZdZdZdddZeddZdd Zd d Z d d Z ddZ ddZ dddZ eddZddZddZddZdS) _EventKeyz$Represent :func:`.listen` arguments.)target identifierfnfn_keyfn_wrapdispatch_targetNcCsP||_||_||_t|tjr6t|jt|jf|_ n t||_ ||_ ||_ 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%r.rrrrsz_EventKey._keycCs,||jkr|St|j|j|j|j|dSdSN)r/)rr!r"r#r$r')r.r&rrr with_wrappers z_EventKey.with_wrappercCs,||jkr|St|j|j|j||jdSdSr2)r'r!r"r#r$r&)r.r'rrrwith_dispatch_targets z_EventKey.with_dispatch_targetc Os|dd}|dd}|dd}|j|j|j}}}t|j|} | ||} || }t|jjj|j} t | dr| |s|r|t j |j|dj ||n|jjj|f||dS)NonceFZ_once_unless_exceptionnamed_sa_warn)retry_on_exception)rr'r#rgetattrdispatchZ_adjust_fn_specr3Z_eventshasattrr7rZ only_oncelistenZ_listen) r.argskwr5Zonce_unless_exceptionr6r"r#r$dispatch_collectionZ adjusted_fnZ stub_functionrrrr<s6        z_EventKey.listencCst|j}|tkr(td|j|j|jft|}|D]4\}}|}|}|dk r:|dk r:| | |q:dS)Nz*No listeners found for event %s / %r / %s ) rr rZInvalidRequestErrorr"r#r$ritemsremover3)r.r rZcollection_refZ listener_refZ collectionZ listener_fnrrrrAs z_EventKey.removecCs |jtkS)z6Return True if this event key is registered to listen.)rr r1rrrcontainssz_EventKey.containsFc CsT|j|j}}t|j|}||j} |r2| |rD| ||n | ||dSr)r'r#r9r: for_modifyZ _set_asyncioinsertappend) r. propagaterDr6retvalZasyncior"r#r?rCrrr base_listens   z_EventKey.base_listencCs |jp |jSr)r&r$r1rrrrsz_EventKey._listen_fncCs"t||r||jdSdSdSNTF)rrErr.rlist_rrrappend_to_lists  z_EventKey.append_to_listcCst||||jdSr)rrArrJrrrremove_from_list s z_EventKey.remove_from_listcCs"t||r||jdSdSdSrI)r appendleftrrJrrrprepend_to_list$s  z_EventKey.prepend_to_list)N)FFFNF)__name__ __module__ __qualname____doc__ __slots__r0propertyrr3r4r<rArBrHrrLrMrOrrrrr!s*       r!)rS __future__r collectionsr)rrr defaultdictdictr rrrrrr objectr!rrrrs