idH&dZddlmZddlmZddlmZddlmZddlmZddlmZejZ Gd d e Z Gd d e Z Gd de ZeZejxZZejxZZejxZZdZdZdZdZdS)aDefines SQLAlchemy's system of class instrumentation. This module is usually not directly visible to user applications, but defines a large part of the ORM's interactivity. instrumentation.py deals with registration of end-user classes for state tracking. It interacts closely with state.py and attributes.py which establish per-instance and per-class-attribute instrumentation, respectively. The class instrumentation system can be customized on a per-class or global basis using the :mod:`sqlalchemy.ext.instrumentation` module, which provides the means to build and specify alternate instrumentation forms. .. versionchanged: 0.8 The instrumentation extension system was moved out of the ORM and into the external :mod:`sqlalchemy.ext.instrumentation` package. When that package is imported, it installs itself within sqlalchemy.orm so that its more comprehensive resolution mechanics take effect. )base) collections)exc) interfaces)state)utilc^eZdZdZejZejZe e j eZ dZ ejZdZdZdZdZedZedZedZed Ze jd Zd/d Zd/d Zd ZdZdZ dZ!e jdZ"dZ#dZ$e j%dZ&e j%dZ'e j%dZ(d0dZ)dZ*dZ+d0dZ,dZ-dZ.dZ/dZ0d Z1d!Z2d"Z3d0d#Z4d$Z5ed%Z6d/d&Z7d/d'Z8d(Z9d)Z:d*Z;d+Ze>Z?d.Z@dS)1 ClassManagerz,Tracks state information at the class level.Nc||_i|_d|_i|_i|_dd|jjDD|_|jD]}|||jj |||j D]2}t|}||j |j3||d|jvrt#jd|zdSdS)Ncg|]}||SN).0mgrs S/opt/cloudlinux/venv/lib/python3.11/site-packages/sqlalchemy/orm/instrumentation.py z)ClassManager.__init__..As)      cVg|]&}t|tt|'Sr) isinstancetypemanager_of_class)rrs rrz)ClassManager.__init__..Cs@dD)) &&r__del__z__del__() method on class %s will cause unreachable cycles and memory leaks, as SQLAlchemy instrumentation often creates reference cycles. Please remove this method.)class_infonew_init local_attrs originals __bases___basesupdatedispatch_events_new_classmanager_instance__mro__r_updatemanage_instrument_init__dict__r warn)selfrbase_baseclsrs r__init__zClassManager.__init__:sJ      K1    [  E KK     88FFF~ 4 4G"7++C %%cl333    ' ' I@CII      ( 'rc t|Sr)idr+s r__hash__zClassManager.__hash__`s $xxrc ||uSrr)r+others r__eq__zClassManager.__eq__cs }rcd|jvS)Nmapper)r)r1s r is_mappedzClassManager.is_mappedfs4=((rc t|Sr) frozensetr1s r _all_key_setzClassManager._all_key_setjsrcXtd|DS)Nc4g|]}|jj|jSr)impl collectionkeyrattrs rrz6ClassManager._collection_impl_keys..qs$ H H H$493G HTX H H Hrr:valuesr1s r_collection_impl_keysz"ClassManager._collection_impl_keysns- H H$++-- H H H   rcXtd|DS)Nc4g|]}|jj|jSr)r>accepts_scalar_loaderrAs rrz5ClassManager._scalar_loader_impls..ws5   92     rrCr1s r_scalar_loader_implsz!ClassManager._scalar_loader_implsts8   KKMM      rc4tj|jr)rUnmappedClassErrorrr1s rr7zClassManager.mapper~s$T[111rc#Ki}|jjddD]s}|jd}|jD]\}|||||jvr"||j|}t |t jr |jr||fV]tdS)areturn an iterator of all classbound attributes that are implement :class:`.InspectionAttr`. This includes :class:`.QueryableAttribute` as well as extension types such as :class:`.hybrid_property` and :class:`.AssociationProxy`. rN)rr%r) setdefaultrrInspectionAttr is_attribute)r+excludefoundsuperclsinheritsr@vals r_all_sqla_attributesz!ClassManager._all_sqla_attributess +AbD1 # #H'*H( # #  h///(+++Cj)#.sJ$=>>#(#s(NNN # # #rcT|jjD]}||jvr|j|cS|S)z5return an attribute on the class without tripping it.)rr%r))r+r@defaultrTs r_get_class_attr_mroz ClassManager._get_class_attr_mrosF +  Hh'''(----(Nrc(||vo||jduS)z\Return True if the given attribute is fully initialized. i.e. has an impl. Nr>r+r@s r_attr_has_implzClassManager._attr_has_impls d{9tCy~T99rc\t|}|t|}|S)aCreate a new ClassManager for a subclass of this ClassManager's class. This is called automatically when attributes are instrumented so that the attributes can be propagated to subclasses against their own class-local manager, without the need for mappers etc. to have already pre-configured managers for the full class hierarchy. Mappers can post-configure the auto-generated ClassManager when needed. r_instrumentation_factorycreate_manager_for_cls)r+clsmanagers r_subclass_managerzClassManager._subclass_managers.#3'' ?.EEcJJGrc|jj|_t|j||_|d|jdSNr.)rr. original_init_generate_initrinstall_memberr1s rr(zClassManager._instrument_initsB "[1&t{D99  J 66666rcP|jr|dd|_dSdSrg)runinstall_memberr1s r_uninstrument_initzClassManager._uninstrument_inits5 = !  ! !* - - - DMMM ! !rcZ|j||jtjSr)r" first_initrr InstanceStater1s r_state_constructorzClassManager._state_constructors%   t{333""rc<t|j|j|dS)z0Mark this instance as the manager for its class.N)setattrr MANAGER_ATTRr1s rr'zClassManager.manages!  T.55555rc:t|j|jdS)z)Disassociate this manager from its class.N)delattrrrtr1s rdisposezClassManager.disposes  T./////rctSr)_default_manager_getterr1s rmanager_getterzClassManager.manager_getters&&rctS)zReturn a (instance) -> InstanceState callable. "state getter" callables should raise either KeyError or AttributeError if no InstanceState could be found for the instance. )_default_state_getterr1s r state_getterzClassManager.state_getters %$rctSr)_default_dict_getterr1s r dict_getterzClassManager.dict_getters##rFc0|r ||jvrdSn ||j|<|||t||||<|jD].}||}|||d/dSNT)rinstall_descriptor_memoized_key_collectionexpire_instancer__subclasses__reinstrument_attribute)r+r@inst propagatedrcrds rrz!ClassManager.instrument_attributes  /d&&&'%)D S !  # #C . . . 00666S ;--// : :C,,S11G  ( (dD 9 9 9 9 : :rc#K|jD]9}t|}|&||ur"|V|r|dD]}|V:dSr)rrrsubclass_managers)r+ recursivercrms rrzClassManager.subclass_managerss;--//  C"3''C3d??   22488     rc^tj|j|||dSr)rar"attribute_instrumentrr]s rpost_configure_attributez%ClassManager.post_configure_attribute s4 )>> Kd3i     rc(||vrdS|r ||jvrdSn|j|=||t|||=|jD])}t |}|r||d*dSr)runinstall_descriptorrrrrruninstrument_attribute)r+r@rrcrds rrz#ClassManager.uninstrument_attributes d?? F  +d&&&' %  % %c * * * 00666 I;--// : :C&s++G :..sD999 : :rc|dx|_|_|jt |D] }||jvr||!dS)z@CD   S$'''''rc0t|j|dSr)rvrr]s rrz!ClassManager.uninstall_descriptor6s S!!!!!rc||j|jfvrtd|z|j|t |j|dt|j||dSr)rrtrrrOgetattrrrs)r+r@implementations rrjzClassManager.install_member9sy 4?D$56 6 6>@CD  !!#wt{C'F'FGGG S.11111rcp|j|d}|t|j||dSdSr)rpoprsr)r+r@originals rrlzClassManager.uninstall_memberBsA>%%c400   DKh / / / / / rc*tj|Sr)rprepare_instrumentation)r+r@collection_classs rinstrument_collection_classz(ClassManager.instrument_collection_classGs23CDDDrcp|}tj||||}||fSr)rCollectionAdapterget_impl)r+r@rfactory user_dataadapters rinitialize_collectionz"ClassManager.initialize_collectionJs?GII / MM#  y   !!rc |r||vS||jvSr)r)r+r@searchs ris_instrumentedzClassManager.is_instrumentedQs"  +$; $** *rc||jSrr\r]s rrzClassManager.get_implWsCy~rcDt|Sr)iterrDr1s r attributeszClassManager.attributesZsDKKMM"""rc|j|j}||||}||||Sr)r__new__rq _state_setter)r+rinstances r new_instancezClassManager.new_instance`sN;&&t{33 =++Hd;;E 8U+++rcb||||}|||dSr)rqrr+rrs rsetup_instancezClassManager.setup_instancegs8 =++Hd;;E 8U+++++rc0t||jdSr)rvrr+rs rteardown_instancezClassManager.teardown_instancels$/*****rc"t||Sr)_SerializeManager)r+r state_dicts r _serializezClassManager._serializeos  333rct||jrdS|j|jur4|jr-||j|S|||}||||S)zInstall a default InstanceState if none is present. A private convenience method used by the __init__ decorator. F) hasattrrr __class__r8re_new_state_if_nonerqrrs rrzClassManager._new_state_if_noners 8T_ - - 5 [ 2 2 2t~ 2 ))"  ** +++Hd;;E   x / / /Lrc,t||jSr)rrrs r has_statezClassManager.has_statesx111rcV||||S)TODO) optimistic)r hasparent)r+rr@rs r has_parentzClassManager.has_parents'}}S!!++Ej+IIIrcdS)z=All ClassManagers are non-zero regardless of attribute state.Trr1s r__bool__zClassManager.__bool__strcJd|jj|jt|fzS)Nz<%s of %r at %x>)r__name__rr0r1s r__repr__zClassManager.__repr__s*! N # K tHH%   rr)F)Ar __module__ __qualname____doc__rDEFAULT_MANAGER_ATTRrtDEFAULT_STATE_ATTRr staticmethodr attrsetterrdeferred_scalar_loaderobjectr.rhrr2r5propertyr8rr;rErImemoized_propertyr7rWrZr^rer(rmrqr'rw hybridmethodrzr}rrrrrrrrrjrlrrrrrrrrrrrrr __nonzero__rrrrr r ,s66,L(J L!Build an __init__ decorator that triggers ClassManager events.zdef __init__(%(apply_pos)s): new_state = class_manager._new_state_if_none(%(self_arg)s) if new_state: return new_state._initialize_instance(%(apply_kw)s) else: return original__init__(%(apply_kw)s) F)groupedim_func func_defaultsN __defaults____kwdefaults__r.) r.r format_argspec_initpy2krlocalscopyexecr_sa_original_initrr) r class_manageroriginal__init__ func_body func_vars func_textfuncrfunc_kw_defaultsenvr.s rriris I()95IIIII%I yM'4DEEot<<  0.$GG "#35EtLL ((--//CC:H'/H!1H. - 93)3"2 OrN)rrrrrrr !group_expirable_memoized_propertyrdictr rrrrainstance_stater| instance_dictrrryrrrrirrrrs2B4ACCn n n n n 4n n n b 55555555D$7$7$7$7$7V$7$7$7R2133 *.)<<&'+'99 $-1-BB*   000   +++++r