U a,@sdZddlmZddlZddlmZddlmZddlmZdd lm Z e e Z d d Z Gd d d eZGdddeZGdddeZddZddZGddde eeZGdddeZGdddeZGdddeZdS)aBase implementation classes. The public-facing ``Events`` serves as the base class for an event interface; its public attributes represent different kinds of events. These attributes are mirrored onto a ``_Dispatch`` class, which serves as a container for collections of listener functions. These collections are represented both at the class level of a particular ``_Dispatch`` class as well as within instances of ``_Dispatch``. )absolute_importN)_ClsLevelDispatch)_EmptyListener)_JoinedListener)utilcCs|d r|dkp|dS)N_dispatchZ _sa_event) startswith)namer VC:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-nyjtotrf\sqlalchemy\event\base.py_is_event_namesrc@seZdZdZddZdS)_UnpickleDispatchzSerializable callable that re-generates an instance of :class:`_Dispatch` given a particular :class:`.Events` subclass. cCs8|jD]$}d|jkr|jdj|SqtddS)Nr z*No class with a 'dispatch' member present.)__mro____dict__r _for_classAttributeError)self _instance_clsclsr r r__call__/s     z_UnpickleDispatch.__call__N)__name__ __module__ __qualname____doc__rr r r rr)src@sxeZdZdZdZeZdddZddZ e dd Z e d d Z d d Z ddZddZddZdddZddZdS) _Dispatcha;Mirror the event listening definitions of an Events class with listener collections. Classes which define a "dispatch" member will return a non-instantiated :class:`._Dispatch` subclass when the member is accessed at the class level. When the "dispatch" member is accessed at the instance level of its owner, an instance of the :class:`._Dispatch` class is returned. A :class:`._Dispatch` class is generated for each :class:`.Events` class defined, by the :func:`._create_dispatcher_class` function. The original :class:`.Events` classes remain untouched. This decouples the construction of :class:`.Events` subclasses from the implementation used by the event internals, and allows inspecting tools like Sphinx to work in an unsurprising way against the public API. )_parentrr_empty_listenersNcsb||_|_rXz|j|_Wq^tk rTfdd|jD|_|j<Yq^Xni|_dS)Ncsi|]}|jt|qSr )r r).0ls instance_clsr r ]sz&_Dispatch.__init__..)rr_empty_listener_regrKeyError_event_descriptors)rparentr#r r"r__init__Ss   z_Dispatch.__init__cCsBz|j|}Wntk r*t|YnXt||j||SdSN)rr&rsetattrr )rr r!r r r __getattr__ds z_Dispatch.__getattr__ccs|jD]}t||VqdSr*) _event_namesgetattr)rkr r rr'os z_Dispatch._event_descriptorscCs|jjSr*)_events_listenrr r rr1vsz_Dispatch._listencCs |||Sr*) __class__)rr#r r rrzsz_Dispatch._for_classcCs|j}||Sr*)r3r)rinstancer#r r r _for_instance}sz_Dispatch._for_instancecCs<d|jjkr0td|jjtfd|ji}||j_|||S)zCreate a 'join' of this :class:`._Dispatch` and another. This new dispatcher will dispatch events to both :class:`._Dispatch` objects. _joined_dispatch_clszJoined%s __slots__)r3rtyper_JoinedDispatcherr-r6)rotherrr r r_joins  z_Dispatch._joincCst|jffSr*)rrr2r r r __reduce__sz_Dispatch.__reduce__TcCs8|jD],}t|trqt||j|j||dqdS)zIPopulate from the listeners in another :class:`_Dispatch` object.)only_propagateN)r' isinstancerr.r for_modify_update)rr:r=r!r r rr@s  z_Dispatch._updatecCs|jD]}||qdSr*)r'r?clear)rr!r r r_clears z_Dispatch._clear)N)T)rrrrr7weakrefWeakKeyDictionaryr%r)r,propertyr'r1rr5r;r<r@rBr r r rr9s     rc@seZdZdZddZdS) _EventMetazKIntercept new Event subclasses and create associated _Dispatch classes.cCs"t||||t||||dSr*)_create_dispatcher_classr8r))r classnamebasesdict_r r rr)sz_EventMeta.__init__N)rrrrr)r r r rrFsrFc Cst|dr|jj}nt}dd|D}td||fd|i}||_|||}|jD](}t||t|||t | |qT|j D]B} t | tr| tk r| j jjD] } t|| j| |j | jqqt|ddr |j} t| drd| jkrt||j_n t||j_dS) zRCreate a :class:`._Dispatch` class corresponding to an :class:`.Events` class.r cSsg|]}t|r|qSr )r)r r/r r r sz,_create_dispatcher_class..z %sDispatchr7_dispatch_targetN_slots_dispatch)hasattrr r3rr8r- _set_dispatchr+r _registrarsappend __bases__ issubclassr0r'r r.rLr7slots_dispatcher dispatcher) rrHrIrJZ dispatch_baseZ event_names dispatch_clsZ dispatch_instr/Zsuper_r!Zthe_clsr r rrGs6     rGcCs.|jjD] }t||t|st|=qdSr*)r r-rPremove)rr/r r r_remove_dispatchers rXc@sNeZdZdZeddZeddZedddZed d Z ed d Z d S)Eventsz>Define event listening functions for a particular target type.cCs|d|_||_|jSr*)r r0)rrVr r rrOs zEvents._set_dispatchcsXfdd}fdd}tdrT||jjsP|t|jjsP|trT||jjrTSdS)Ncstfdd|DS)Nc3s|]}tj|VqdSr*)r>r )r ttargetr r sz;Events._accept_with..dispatch_is..)all)typesr[r r dispatch_issz(Events._accept_with..dispatch_iscstjj|Sr*)r>r r()rZr[r rdispatch_parent_issz/Events._accept_with..dispatch_parent_isr )rNr r3r8r9)rr\r`rar r[r _accept_withs      zEvents._accept_withFcCs|j||||ddS)N) propagateinsertnamedasyncio)Z base_listen)r event_keyrcrdrerfr r rr1s zEvents._listencCs |dSr*)rW)rrgr r r_remove szEvents._removecCs|jdSr*)r rB)rr r rrBsz Events._clearN)FFFF) rrrr staticmethodrO classmethodrbr1rhrBr r r rrYs    rYc@s<eZdZdZdZddZddZeddZed d Z d S) r9z5Represent a connection between two _Dispatch objects.localr(rcCs||_||_|jj|_dSr*rk)rrlr(r r rr)sz_JoinedDispatcher.__init__cCs.t|j|}t|j|j|}t||j||Sr*)r.rlrr(r r+)rr r!Zjlr r rr, s z_JoinedDispatcher.__getattr__cCs|jjSr*)r(r1r2r r rr1(sz_JoinedDispatcher._listencCs|jjSr*)r(r0r2r r rr0,sz_JoinedDispatcher._eventsN) rrrrr7r)r,rEr1r0r r r rr9s r9c@s eZdZdZddZddZdS)rUzDescriptor used by target classes to deliver the _Dispatch class at the class level and produce new _Dispatch instances for target instances. cCs|j|_||_dSr*)r events)rrmr r rr)9szdispatcher.__init__c Csh|dkr|jS|j|}z||jd<Wn:tk rb}ztjtd|f|dW5d}~XYnX|S)Nr zGtarget %r doesn't have __dict__, should it be defining _slots_dispatch?)Zreplace_context)r r5rrrZraise_ TypeError)robjrdispZaer r r__get__=s zdispatcher.__get__N)rrrrr)rqr r r rrU1srUc@seZdZddZdS)rTcCs4|dkr|jSt|dr|jS|j|}||_|S)NrM)r rNrMr5)rrorrpr r rrqPs  zslots_dispatcher.__get__N)rrrrqr r r rrTOsrT)r __future__rrCattrrrrr defaultdictlistrProbjectrrr8rFrGrXwith_metaclassrYr9rUrTr r r rs"       k )9