§ <ˆjó ãó‚—dZddlZddlmZddlmZddlmZddlmZddlm Z dd lm Z dd lm Z dd lm Z dd lm Z dd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z dd lm!Z!d!d"lm"Z"d!d#lm#Z#d!d$lm$Z$e#j%Gd%„d&ej&ej'ej(¦«¦«Z)Gd'„d(e)¦«Z*d)„Z+e$j,d*¦«Z-e$j,d+¦«Z.e$j,d,¦«Z/e$j,d-¦«Z0e$j,d.¦«Z1Gd/„d0e2¦«Z3Gd1„d2e2¦«Z4Gd3„d4e4¦«Z5Gd5„d6e5¦«Z6Gd7„d8e4¦«Z7d9„Z8e$j,d:¦«Z9e:e;e¦«e;e¦«e;e¦«g¦«Z<e$j=d;gd<¢¦«Z>Gd=„d;e>¦«Z>e>ddd¦«Z?efd>„Z@efd?„ZAdNdA„ZBdB„ZC dOdC„ZD dPdD„ZEdE„ZFdF„ZGdG„ZHdH„ZIdQdI„ZJdJ„ZKdK„ZLdL„ZMdM„ZNdS)RzÍDefines instrumentation for class attributes and their interaction with instances. This module is usually not directly visible to user applications, but defines a large part of the ORM's interactivity. éNé)Ú collections)Úexc)Ú interfaces)Ú ATTR_EMPTY)Ú ATTR_WAS_SET)Ú CALLABLES_OK)ÚINIT_OK)Ú instance_dict©Úinstance_state)Ú instance_str)ÚLOAD_AGAINST_COMMITTED)Úmanager_of_class)Ú NEVER_SET)Ú NO_AUTOFLUSH)Ú NO_CHANGE)ÚNO_RAISE)ÚNO_VALUE)ÚNON_PERSISTENT_OK)ÚPASSIVE_CLASS_MISMATCH)ÚPASSIVE_NO_FETCH)ÚPASSIVE_NO_FETCH_RELATED)ÚPASSIVE_NO_INITIALIZE)ÚPASSIVE_NO_RESULT)Ú PASSIVE_OFF)ÚPASSIVE_ONLY_PERSISTENT)ÚPASSIVE_RETURN_NEVER_SET)ÚRELATED_OBJECT_OK)ÚSQL_OK)Ú state_stré)Úevent)Ú inspection)Úutilcó&—eZdZdZdZ dd„Zejd„¦«Ze d„¦«Z e fd„Z d„Z ejd „¦«Zejd „¦«Ze d „¦«Zd „Zd „Zd„Zd„Zd„Zd„Zd„Zd„Zdd„Zd„Zd„Zejd„¦«Z dS)ÚQueryableAttributea«Base class for :term:`descriptor` objects that intercept attribute events on behalf of a :class:`.MapperProperty` object. The actual :class:`.MapperProperty` is accessible via the :attr:`.QueryableAttribute.property` attribute. .. seealso:: :class:`.InstrumentedAttribute` :class:`.MapperProperty` :attr:`_orm.Mapper.all_orm_descriptors` :attr:`_orm.Mapper.attrs` TNcó"—||_||_||_||_||_||_t |¦«}|rQ|jD]K}||vrC|j  ||j¦«||jj r d|j_ ŒJdSdS©NT) Úclass_ÚkeyÚimplÚ comparatorÚ _parententityÚ_of_typerÚ_basesÚdispatchÚ_updateÚ_active_history) Úselfr*r+r,r-Ú parententityÚof_typeÚmanagerÚbases úP/opt/cloudlinux/venv/lib64/python3.11/site-packages/sqlalchemy/orm/attributes.pyÚ__init__zQueryableAttribute.__init__Os®€ðˆŒ ؈ŒØˆŒ Ø$ˆŒØ)ˆÔ؈Œ å" 6Ñ*Ô*ˆà ð =ð œð =ð =�ؘ$�;�;Ø”M×)Ò)¨$¨s¬)Ô*<Ñ=Ô=Ð=ؘC”yÔ)Ô9ð=Ø8<˜œ Ô5øð =ð =ð =ð =ócó—|jjS©N)r,Úsupports_population©r4s r9Ú_supports_populationz'QueryableAttribute._supports_populationjs €àŒyÔ,Ð,r;có—|jjSr=)r,Ú uses_objectsr?s r9Ú_impl_uses_objectsz%QueryableAttribute._impl_uses_objectsns €àŒyÔ%Ð%r;cón—|j t|¦«t|¦«|¦«Sr=)r,Ú get_historyr r )r4ÚinstanceÚpassives r9rEzQueryableAttribute.get_historyrs3€ØŒy×$Ò$Ý ˜8Ñ $Ô $¥m°HÑ&=Ô&=¸wñ ô ð r;có—|Sr=©r?s r9Ú__selectable__z!QueryableAttribute.__selectable__ws€àˆ r;có—|jjS)a´Return the 'info' dictionary for the underlying SQL element. The behavior here is as follows: * If the attribute is a column-mapped property, i.e. :class:`.ColumnProperty`, which is mapped directly to a schema-level :class:`_schema.Column` object, this attribute will return the :attr:`.SchemaItem.info` dictionary associated with the core-level :class:`_schema.Column` object. * If the attribute is a :class:`.ColumnProperty` but is mapped to any other kind of SQL expression other than a :class:`_schema.Column`, the attribute will refer to the :attr:`.MapperProperty.info` dictionary associated directly with the :class:`.ColumnProperty`, assuming the SQL expression itself does not have its own ``.info`` attribute (which should be the case, unless a user-defined SQL construct has defined one). * If the attribute refers to any other kind of :class:`.MapperProperty`, including :class:`.RelationshipProperty`, the attribute will refer to the :attr:`.MapperProperty.info` dictionary associated with that :class:`.MapperProperty`. * To access the :attr:`.MapperProperty.info` dictionary of the :class:`.MapperProperty` unconditionally, including for a :class:`.ColumnProperty` that's associated directly with a :class:`_schema.Column`, the attribute can be referred to using :attr:`.QueryableAttribute.property` attribute, as ``MyClass.someattribute.property.info``. .. seealso:: :attr:`.SchemaItem.info` :attr:`.MapperProperty.info` )r-Úinfor?s r9rLzQueryableAttribute.info{s€ðPŒÔ#Ð#r;có4—tj|j¦«S)a Return an inspection instance representing the parent. This will be either an instance of :class:`_orm.Mapper` or :class:`.AliasedInsp`, depending upon the nature of the parent entity which this attribute is associated with. )r$Úinspectr.r?s r9ÚparentzQueryableAttribute.parent¥s€õÔ! $Ô"4Ñ5Ô5Ð5r;có4—|j ¦«S)zÙThe SQL expression object represented by this :class:`.QueryableAttribute`. This will typically be an instance of a :class:`.ColumnElement` subclass representing a column expression. ©r-Ú__clause_element__r?s r9Ú expressionzQueryableAttribute.expression±s€ðŒ×1Ò1Ñ3Ô3Ð3r;có4—|j ¦«Sr=rQr?s r9rRz%QueryableAttribute.__clause_element__¼s€ØŒ×1Ò1Ñ3Ô3Ð3r;có4—|j ¦«S)znlike __clause_element__(), but called specifically by :class:`_query.Query` to allow special behavior.)r-Ú_query_clause_elementr?s r9rVz(QueryableAttribute._query_clause_element¿s€ðŒ×4Ò4Ñ6Ô6Ð6r;có6—|j |¦«S)z'Return setter tuples for a bulk UPDATE.)r-Ú_bulk_update_tuples©r4Úvalues r9rXz&QueryableAttribute._bulk_update_tuplesÅs€ðŒ×2Ò2°5Ñ9Ô9Ð9r;có–—|jrJ‚| |j|j|j|j |¦«|¬¦«S)N)r,r-r5)r/Ú __class__Úentityr+r,r-Úadapt_to_entity©r4r^s r9r^z"QueryableAttribute.adapt_to_entityÊsQ€Ø”=Ð Ð Ð Ø�~Š~Ø Ô "Ø ŒHؔؔ×6Ò6°ÑGÔGØ(ð ñ ô ð r;có„—t|j|j|j|j |¦«|j|¬¦«S)N)r6)r'r*r+r,r-r6r.)r4Úclss r9r6zQueryableAttribute.of_typeÔsD€Ý!Ø ŒKØ ŒHØ ŒIØ ŒO× #Ò # CÑ (Ô (Ø Ô Øð  ñ ô ð r;cóP—| ¦« |¦«Sr=)rVÚlabel)r4Únames r9rczQueryableAttribute.labelÞs"€Ø×)Ò)Ñ+Ô+×1Ò1°$Ñ7Ô7Ð7r;có$—||jg|¢Ri|¤ŽSr=©r-©r4ÚopÚotherÚkwargss r9ÚoperatezQueryableAttribute.operateás$€Øˆr�$”/Ð4 EÐ4Ð4Ð4¨VÐ4Ð4Ð4r;c ó —|||jfi|¤ŽSr=rfrgs r9Úreverse_operatez"QueryableAttribute.reverse_operateäs€Øˆr�%˜œÐ3Ð3¨FÐ3Ð3Ð3r;Fcó>—|j ||¬¦«duS)N)Ú optimisticF©r,Ú hasparent)r4Ústateros r9rqzQueryableAttribute.hasparentçs"€ØŒy×"Ò" 5°ZÐ"Ñ@Ô@ÈÐMÐMr;c ó— t|j|¦«S#t$rc}tjtdt |¦«j›dt |j¦«j›d|›d|›�¦«|¬¦«Yd}~dSd}~wwxYw)NúNeither ú object nor ú object associated with ú has an attribute ©Úreplace_context)Úgetattrr-ÚAttributeErrorr%Úraise_ÚtypeÚ__name__)r4r+Úerrs r9Ú __getattr__zQueryableAttribute.__getattr__ês¾€ð ݘ4œ?¨CÑ0Ô0Ð 0øÝð ð ð Ý ŒKÝ�õ˜T™ œ Ô+Ð+Ð+ݘTœ_Ñ-Ô-Ô6Ð6Ð6ؘ˜Ø˜ð ñ ô ð!$ð ñ ô ð ð ð ð ð ð ð øøøøð øøøs‚— B¡AA?Á?Bcó.—|jj›d|j›�S©Nú.©r*r~r+r?s r9Ú__str__zQueryableAttribute.__str__üó€Øœ+Ô.Ð.Ð.°´°Ð9Ð9r;có—|jjS)zèReturn the :class:`.MapperProperty` associated with this :class:`.QueryableAttribute`. Return values here will commonly be instances of :class:`.ColumnProperty` or :class:`.RelationshipProperty`. ©r-Úpropertyr?s r9r‰zQueryableAttribute.propertyÿs€ðŒÔ'Ð'r;)NNNN©F)r~Ú __module__Ú __qualname__Ú__doc__Ú is_attributer:r%Úmemoized_propertyr@r‰rCrrErJrLrOrSrRrVrXr^r6rcrkrmrqr€r…rIr;r9r'r'5sЀ€€€€ð ðð$€Lð ØØØð=ð=ð=ð=ð6 Ôð-ð-ñÔð-ðð&ð&ñ„Xð&ð-8ð ð ð ð ð ððð Ôð'$ð'$ñÔð'$ðR Ôð 6ð 6ñÔð 6ðð4ð4ñ„Xð4ð4ð4ð4ð7ð7ð7ð :ð:ð:ð  ð ð ð ð ð ð8ð8ð8ð5ð5ð5ð4ð4ð4ðNðNðNðNðððð$:ð:ð:ð Ôð (ð (ñÔð (ð (ð (r;r'có$—eZdZdZd„Zd„Zd„ZdS)ÚInstrumentedAttributez¤Class bound instrumented attribute which adds basic :term:`descriptor` methods. See :class:`.QueryableAttribute` for a description of most features. cót—|j t|¦«t|¦«|d¦«dSr=)r,Úsetr r )r4rFrZs r9Ú__set__zInstrumentedAttribute.__set__s=€Ø Œ � Š Ý ˜8Ñ $Ô $¥m°HÑ&=Ô&=¸uÀdñ ô ð ð ð r;cóp—|j t|¦«t|¦«¦«dSr=)r,Údeleter r )r4rFs r9Ú __delete__z InstrumentedAttribute.__delete__s0€Ø Œ ×Ò�¨Ñ1Ô1µ=ÀÑ3JÔ3JÑKÔKÐKÐKÐKr;có²—|€|St|¦«}|jr|j|vr ||jS|j t |¦«|¦«Sr=)r r@r+r,Úgetr )r4rFÚownerÚdict_s r9Ú__get__zInstrumentedAttribute.__get__s\€Ø Р؈Kå˜hÑ'Ô'ˆØ Ô $ð B¨¬°UÐ):Ð):ؘœ”?Ð "à”9—=’=¥°Ñ!9Ô!9¸5ÑAÔAÐ Ar;N)r~r‹rŒr�r”r—rœrIr;r9r‘r‘ sS€€€€€ððð ð ð ð LðLðLðBðBðBðBðBr;r‘có´‡—Gˆfd„dt¦«}t‰¦«jdz|_tj|t‰¦«d‰¬¦«|S)z´Create an QueryableAttribute / user descriptor hybrid. Returns a new QueryableAttribute type that delegates descriptor behavior and getattr() to the given descriptor. cóŽ•—eZdZdZ d d„ZdZed„¦«Zed„¦«Zej d„¦«Z d„Z d „Z d „Z ˆfd „ZdS) ú'create_proxied_attribute..ProxyzžPresents the :class:`.QueryableAttribute` interface as a proxy on top of a Python descriptor / :class:`.PropComparator` combination. Ncóh—||_||_||_||_||_||_||_dSr=)r*r+Ú descriptorÚoriginal_propertyÚ _comparatorÚ_adapt_to_entityr�)r4r*r+r¡r-r^Údocr¢s r9r:z0create_proxied_attribute..Proxy.__init__:s<€ð!ˆDŒK؈DŒHØ(ˆDŒOØ%6ˆDÔ "Ø)ˆDÔ Ø$3ˆDÔ !؈DŒLˆLˆLr;Tcó\—|jduo#t|j|j¦«jjSr=)r¢rzr*r+r,rBr?s r9rCz:create_proxied_attribute..Proxy._impl_uses_objectsNs1€ðÔ&¨dÐ2ðEݘDœK¨¬Ñ2Ô2Ô7ÔDð r;có—|jjSr=rˆr?s r9r‰z0create_proxied_attribute..Proxy.propertyUs €à”?Ô+Ð +r;cóÊ—tj|j¦«r| ¦«|_|jr$|j |j¦«|_|jSr=)r%Úcallabler£r¤r^r?s r9r-z2create_proxied_attribute..Proxy.comparatorYsb€åŒ}˜TÔ-Ñ.Ô.ð 6Ø#'×#3Ò#3Ñ#5Ô#5�Ô ØÔ$ð Ø#'Ô#3×#CÒ#CØÔ)ñ$ô$�Ô ðÔ#Ð #r;có\—| |j|j|j|j|¦«Sr=)r\r]r+r¡r£r_s r9r^z7create_proxied_attribute..Proxy.adapt_to_entitycs1€Ø—>’>ØÔ&ؔؔØÔ Øñ ôð r;cóV—|j ||¦«}||jur|€|S|Sr=)r¡rœ)r4rFršÚretvals r9rœz/create_proxied_attribute..Proxy.__get__ls7€Ø”_×,Ò,¨X°uÑ=Ô=ˆFð˜œÐ(Ð(¨XÐ-=Ø� à� r;có.—|jj›d|j›�Sr‚r„r?s r9r…z/create_proxied_attribute..Proxy.__str__vs€Ø"œkÔ2Ð2Ð2°D´H°HÐ=Ð =r;cóp•— t‰|¦«S#t$�r}|dkr#tjtd¦«|¬¦« |j} t||¦«cYd}~S#t$r]}tjtdt ‰¦«j›dt |¦«j›d|›d|›�¦«|¬¦«Yd}~n]d}~wwxYw#t$rH}tjtdt ‰¦«j›d|›d|›�¦«|¬¦«Yd}~nd}~wwxYwYd}~dSYd}~dSd}~wwxYw) zNDelegate __getattr__ to the original descriptor and/or comparator.r-rxNrtrurvrwz; object nor unconfigured comparator object associated with )rzr{r%r|r-r}r~)r4Ú attributerr-Úerr3Úerr2r¡s €r9r€z3create_proxied_attribute..Proxy.__getattr__ysø€ð# ݘz¨9Ñ5Ô5Ð5øÝ!ð! ñ! ð! Ø  Ò,Ð,Ý”KÝ& |Ñ4Ô4Àcðñôððà!%¤�JðÝ& z°9Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=øÝ)ð ð ð Ýœ Ý*˜Nõ%)¨Ñ$4Ô$4Ô$=Ð$=Ð$=Ý$(¨Ñ$4Ô$4Ô$=Ð$=Ð$=Ø$( D DØ$- Ið !"ñ ô ð-1ð ñ ô ð ð ð ð ð ð øøøøð øøøøõ&ðððÝ”KÝ&˜õ $ JÑ/Ô/Ô8Ð8Ð8¸$¸$¸$À À ðKñôð )-ð ñôððððððøøøøðøøøð ð ð ð ð ð ððððððøøøøð! øøøscƒ“ D5ž)D0ÁCÁA%ÁD5Á% C Á/ACÃD0ÃC à D0à D!Ã>DÄD0ÄD!Ä!D0Ä0D5©NNN)r~r‹rŒr�r:Ú_is_internal_proxyr‰rCr%r�r-r^rœr…r€)r¡s€r9ÚProxyrŸ3sßø€€€€€ð ð ð!ØØ"ð ð ð ð ð$"Ðà ð ð ñ Œð ð ð ,ð ,ñ Œð ,ð Ô ð $ð $ñ Ô ð $ð ð ð ð ð ð ð >ð >ð >ð& ð& ð& ð& ð& ð& ð& r;r´r¡)rdÚ from_instance)r'r}r~r%Úmonkeypatch_proxied_specials)r¡r´s` r9Úcreate_proxied_attributer·)sŽø€ðlðlðlðlðlðlðlÕ"ñlôlðlõ\˜*Ñ%Ô%Ô.°Ñ8€E„NåÔ%Ø �t�JÑÔ lÀ*ðñôðð €Lr;ÚREMOVEÚAPPENDÚREPLACEÚ BULK_REPLACEÚMODIFIEDcó>—eZdZdZdZd„Zd„Zed„¦«Zd„Z dS)ÚEventa¢A token propagated throughout the course of a chain of attribute events. Serves as an indicator of the source of the event and also provides a means of controlling propagation across a chain of attribute operations. The :class:`.Event` object is sent as the ``initiator`` argument when dealing with events such as :meth:`.AttributeEvents.append`, :meth:`.AttributeEvents.set`, and :meth:`.AttributeEvents.remove`. The :class:`.Event` object is currently interpreted by the backref event handlers, and is used to control the propagation of operations across two mutually-dependent attributes. .. versionadded:: 0.9.0 :attribute impl: The :class:`.AttributeImpl` which is the current event initiator. :attribute op: The symbol :attr:`.OP_APPEND`, :attr:`.OP_REMOVE`, :attr:`.OP_REPLACE`, or :attr:`.OP_BULK_REPLACE`, indicating the source operation. ©r,rhÚ parent_tokencóD—||_||_|jj|_dSr=r¿)r4Úattribute_implrhs r9r:zEvent.__init__Îs#€Ø"ˆŒ ؈ŒØ œIÔ2ˆÔÐÐr;cóh—t|t¦«o|j|juo|j|jkSr=)Ú isinstancer¾r,rh)r4ris r9Ú__eq__z Event.__eq__Ós6€å �u�eÑ $Ô $ð $Ø” ˜dœiÐ'ð $à”˜DœGÒ#ð r;có—|jjSr=)r,r+r?s r9r+z Event.keyÚs €àŒyŒ}Ðr;có6—|j |¦«Sr=rp)r4rrs r9rqzEvent.hasparentÞs€ØŒy×"Ò" 5Ñ)Ô)Ð)r;N) r~r‹rŒr�Ú __slots__r:rÅr‰r+rqrIr;r9r¾r¾°sm€€€€€ððð6-€Ið3ð3ð3ð  ð ð ðððñ„Xðð*ð*ð*ð*ð*r;r¾cóÆ—eZdZdZ dd„ZdZd„Zd„Zd „Ze ee¦«Z dd „Z d „Z e fd „Zefd „Zd„Ze fd„Ze fd„Ze fd„Ze fd„Ze ddfd„Ze fd„Zd„ZdS)Ú AttributeImplz4internal implementation for instrumented attributes.FNTc  ó´—||_||_||_||_||_| p||_| |_|€tj|_ n||_ | �| |_ n |j |_ t|¦«|}tj|pg¦«D]}| ||¦«Œ|r d|j_| |_t%|t&¦«|_dS)a*Construct an AttributeImpl. :param \class_: associated class :param key: string name of the attribute :param \callable_: optional function which generates a callable based on a parent instance, which produces the "default" values for a scalar or collection attribute when it's first accessed, if not present already. :param trackparent: if True, attempt to track if an instance has a parent attached to it via this attribute. :param extension: a single or list of AttributeExtension object(s) which will receive set/delete/append/remove/etc. events. The event package is now used. .. deprecated:: 1.3 The :paramref:`.AttributeImpl.extension` parameter is deprecated and will be removed in a future release, corresponding to the "extension" parameter on the :class:`.MapperProprty` classes like :func:`.column_property` and :func:`_orm.relationship` The events system is now used. :param compare_function: a function that compares two values which are normally assignable to this attribute. :param active_history: indicates that get_history() should always return the "old" value, even if it means executing a lazy callable upon attribute change. :param parent_token: Usually references the MapperProperty, used as a key for the hasparent() function to identify an "owning" attribute. Allows multiple AttributeImpls to all match a single owner attribute. :param expire_missing: if False, don't add an "expiry" callable to this attribute during state.expire_attributes(None), if no value is present for this key. :param send_modified_events: if False, the InstanceState._modified_event method will have no effect; this means the attribute will never show up as changed in a history entry. NT)r*r+Ú callable_r1Ú trackparentrÀÚsend_modified_eventsÚoperatorÚeqÚis_equalÚaccepts_scalar_loaderÚdefault_accepts_scalar_loaderrr%Úto_listÚ_adapt_listenerr3Úexpire_missingr¾Ú OP_MODIFIEDÚ_modified_token)r4r*r+rÌr1rÍÚ extensionÚcompare_functionÚactive_historyrÀrÖrÎrÒrjÚattrÚexts r9r:zAttributeImpl.__init__åsî€ðLˆŒ ؈ŒØ"ˆŒØ ˆŒ Ø&ˆÔØ(Ð0¨DˆÔØ$8ˆÔ!Ø Ð #Ý$œKˆDŒMˆMà,ˆDŒMà Ð ,Ø)>ˆDÔ &Ð &à)-Ô)KˆDÔ &õ  Ñ'Ô'¨Ô,ˆå”<   ¨RÑ0Ô0ð +ð +ˆCØ × Ò   cÑ *Ô *Ð *Ð *à ð 1Ø,0ˆDŒMÔ )à,ˆÔÝ$ T­;Ñ7Ô7ˆÔÐÐr;) r*r+rÌr1rÍrÀrÎrÑrÖrØrÒcó.—|jj›d|j›�Sr‚r„r?s r9r…zAttributeImpl.__str__Wr†r;có—|jjS)z(Backwards compat for impl.active_history©r1r3r?s r9Ú_get_active_historyz!AttributeImpl._get_active_historyZs€ðŒ}Ô,Ð,r;có—||j_dSr=ràrYs r9Ú_set_active_historyz!AttributeImpl._set_active_history_s€Ø(-ˆŒ Ô%Ð%Ð%r;có†—d}|js J|¦«‚|j t|j¦«|¦«duS)a4Return the boolean value of a `hasparent` flag attached to the given state. The `optimistic` flag determines what the default return value should be if no `hasparent` flag can be located. As this function is used to determine if an instance is an *orphan*, instances that were loaded from storage should be assumed to not be orphans, until a True/False value for this flag is set. An instance attribute that is loaded by a callable function will also not have a `hasparent` flag. ú6This AttributeImpl is not configured to track parents.F)rÍÚparentsr™ÚidrÀ)r4rrroÚmsgs r9rqzAttributeImpl.hasparentdsM€ð GˆØÔÐ$Ð$ Ñ$Ô$Ðð ŒM× Ò �b Ô!2Ñ3Ô3°ZÑ @Ô @ÈÐ Mð r;c ó~—d}|js J|¦«‚t|j¦«}|r ||j|<dS||jvrt|j|}|durc|j|jkrS| ¦«€=t jdt|¦«›dt|¦«›d|j›d�¦«‚dSd|j|<dS)zÁSet a boolean flag on the given item corresponding to whether or not it is attached to a parent object via the attribute represented by this ``InstrumentedAttribute``. råFNzRemoving state z from parent state z along attribute 'zV', but the parent record has gone stale, can't be sure this is the most recent parent.) rÍrçrÀrær+ÚobjÚorm_excÚStaleDataErrorr!)r4rrÚ parent_staterZrèÚid_Ú last_parents r9Ú sethasparentzAttributeImpl.sethasparent{sö€ð GˆØÔÐ$Ð$ Ñ$Ô$Ðå�Ô"Ñ#Ô#ˆØ ð 'Ø!-ˆEŒM˜#Ñ Ð Ð à�e”mÐ#Ð#Ø#œm¨CÔ0� ð  uÐ,Ð,Ø#œ¨<Ô+;Ò;Ð;ð#—’Ñ(Ô(Ð0Ý%Ô4Ð4õ!*¨%Ñ 0Ô 0Ð 0Ð 0Ý )¨,Ñ 7Ô 7Ð 7Ð 7Ø $¤  ð ñ ô ð ð�Fà!&ˆEŒM˜#Ñ Ð Ð r;có—t¦«‚r=©ÚNotImplementedError©r4rrr›rGs r9rEzAttributeImpl.get_history¢s€Ý!Ñ#Ô#Ð#r;có—t¦«‚)a¦Return a list of tuples of (state, obj) for all objects in this attribute's current state + history. Only applies to object-based attributes. This is an inlining of existing functionality which roughly corresponds to: get_state_history( state, key, passive=PASSIVE_NO_INITIALIZE).sum() ròrôs r9Úget_all_pendingzAttributeImpl.get_all_pending¥s€õ "Ñ#Ô#Ð#r;cóX—d}|jjD]}||||¦«}|tur|}Œ|S)z;Initialize the given state's attribute with an empty value.N)r1Ú init_scalarr)r4rrr›rZÚfnÚrets r9Ú initializezAttributeImpl.initialize·sF€ðˆØ”-Ô+ð ð ˆBØ�"�U˜E 5Ñ)Ô)ˆCØ�*Ð$Ð$Ø�øàˆ r;có¼—|j|vr ||jS|j}||jvs|j|turü|tzstS||jvr| ||¦«}nH||jvr|j|}|||¦«}n%|jr| ||¦«}nt}|tus |tur|S|turF ||S#t$r0}tj td|z¦«|¬¦«Yd}~n(d}~wwxYw|tur| |||¦«S|tzstS| ||¦«S)züRetrieve a value from the given object. If a callable is assembled on this object's attribute, and passive is False, the callable will be executed and the resulting value will be set as the new value for this attribute. z=Deferred loader for attribute %r failed to populate correctlyrxN)r+Úcommitted_staterr rÚexpired_attributesÚ _load_expiredÚ callablesrÌrrÚKeyErrorr%r|Úset_committed_valuer rû)r4rrr›rGr+rZrÌrs r9r™zAttributeImpl.getÂs€ð Œ8�uРРؘœ”?Ð "ð”(ˆCà˜5Ô0Ð0Ð0ØÔ(¨Ô-µÐ:Ð:à¥Ñ-ð-Ý,Ð,à˜%Ô2Ð2Ð2Ø!×/Ò/°°wÑ?Ô?�E�EؘEœOÐ+Ð+Ø %¤°Ô 4�IØ%˜I e¨WÑ5Ô5�E�EØ”^ð'Ø ŸNšN¨5°'Ñ:Ô:�E�Eå&�EàÕ-Ð-Ð-°½)Ð1CÐ1CØ �LØ�lÐ*Ð*ð Ø$ SœzÐ)øÝ#ð ð ð åœ Ý$ð!,à.1ñ!2ñôð -0ð ñôððððððøøøøð øøøð¥*Ð,Ð,Ø×3Ò3°E¸5À%ÑHÔHÐHà�WÑ$ð 5Ý Ð ð—’ u¨eÑ4Ô4Ð4sÃCà DÃ$&DÄDcó:—| |||||¬¦«dS©N©rG©r“©r4rrr›rZÚ initiatorrGs r9ÚappendzAttributeImpl.appendös$€Ø �Š�˜˜u i¸ˆÑAÔAÐAÐAÐAr;có<—| ||d|||¬¦«dS)N)rGÚ check_oldrrs r9ÚremovezAttributeImpl.removeùs4€Ø �ŠØ �5˜$  °7Àeð ñ ô ð ð ð r;c ó>—| ||d|||d¬¦«dS)NT)rGr Úpoprrs r9rzAttributeImpl.popþs<€Ø �ŠØ Ø Ø Ø ØØØð ñ ô ð ð ð r;có—t¦«‚r=rò)r4rrr›rZrrGr rs r9r“zAttributeImpl.set s€õ"Ñ#Ô#Ð#r;cóš—|j|jvr&|j|j}|ttfvrdS|S| |||¬¦«S)z,return the unchanged value of this attributeNr)r+rýrrr™)r4rrr›rGrZs r9Úget_committed_valuez!AttributeImpl.get_committed_valuesU€ð Œ8�uÔ,Ð ,Ð ,ØÔ)¨$¬(Ô3ˆEØ�¥9Ð-Ð-Ð-Ø�tà� à—8’8˜E 5°'�8Ñ:Ô:Ð :r;cóR—|||j<| ||jg¦«|S)z=set an attribute value on the given instance and 'commit' it.)r+Ú_commit)r4rrr›rZs r9rz!AttributeImpl.set_committed_value!s,€ð ˆˆdŒh‰Ø � Š �e˜dœh˜ZÑ(Ô(Ð(؈ r;)FNNFNTTNrŠ)r~r‹rŒr�r:rÈr…rárãr‰rÛrqrðrrErrörûr™r r rr“rrrIr;r9rÊrÊâs°€€€€€Ø>Ð>ðØØØØØØ!Ø"ðb8ðb8ðb8ðb8ðH €Ið:ð:ð:ð-ð-ð-ð .ð.ð.ð�XÐ1Ð3FÑGÔG€Nð ð ð ð ð.%'ð%'ð%'ðN1<ð$ð$ð$ð$ð5Jð$ð$ð$ð$ð$ ð ð ð)4ð25ð25ð25ð25ðh>IðBðBðBðBð>Ið ð ð ð ð ;Fð  ð  ð  ð  ð"ØØ ð $ð $ð $ð $ð9Dð ;ð ;ð ;ð ;ðððððr;rÊcóz‡—eZdZdZdZdZdZdZdZdZ ˆfd„Z d„Z e fd„Z e ddfd „Zd „Zd „Zed „¦«ZˆxZS) ÚScalarAttributeImplz8represents a scalar value-holding InstrumentedAttribute.TF)Ú_replace_tokenÚ _append_tokenÚ _remove_tokenc󾕗tt|¦«j|i|¤Žt|t¦«x|_|_t|t¦«|_dSr=) Úsuperrr:r¾Ú OP_REPLACErrÚ OP_REMOVEr)r4ÚargÚkwr\s €r9r:zScalarAttributeImpl.__init__4sXø€Ø1�Õ! 4Ñ(Ô(Ô1°3Ð=¸"Ð=Ð=Ð=Ý38¸½zÑ3JÔ3JÐJˆÔ˜dÔ0Ý" 4­Ñ3Ô3ˆÔÐÐr;cóÖ—|jjr| ||t¦«}n | |jt ¦«}|jjr| ||||j¦«|  |||¦«|  |jt ¦«}|t ur0|t ur)|j s$|j|j vrtd|z¦«‚dSdSdSdS)Nú%s object does not have a value)r1r3r™rr+rr Úfire_remove_eventrÚ_modified_eventrÚexpiredrþr{©r4rrr›ÚoldÚexistings r9r–zScalarAttributeImpl.delete9sí€Ø Œ=Ô (ð 0Ø—(’(˜5 %Õ)AÑBÔBˆCˆCà—)’)˜DœH¥hÑ/Ô/ˆCà Œ=Ô ð JØ × "Ò " 5¨%°°dÔ6HÑ IÔ IÐ IØ ×Ò˜e T¨3Ñ/Ô/Ð/à—9’9˜TœX¥xÑ0Ô0ˆà �Ð Ð Ø•x��Ø”Mð à” Ô 8Ð8Ð8å Ð!BÀTÑ!IÑJÔJÐ Jð !Ð Ø���à8Ð8r;có—|j|vr't ||||j¦«S|tzr |tz}| |||¬¦«}|t urt St |||¦«Sr)r+ÚHistoryÚfrom_scalar_attributer r™rÚ HISTORY_BLANK©r4rrr›rGÚcurrents r9rEzScalarAttributeImpl.get_historyL󅀨 Œ8�uÐ Ð Ý×0Ò0°°u¸eÀDÄH¼oÑNÔNÐ Nà�Ñ ð #Ø�7Ñ"�Ø—h’h˜u e°W�hÑ=Ô=ˆGØÕ+Ð+Ð+Ý$Ð$å×4Ò4°T¸5À'ÑJÔJÐJr;Ncó$—|jjr| ||t¦«}n | |jt ¦«}|jjr| |||||¦«}| |||¦«|||j<dSr=) r1r3r™rr+rr“Úfire_replace_eventr"© r4rrr›rZrrGr rr%s r9r“zScalarAttributeImpl.setXs”€ð Œ=Ô (ð 0Ø—(’(˜5 %Õ)AÑBÔBˆCˆCà—)’)˜DœH¥hÑ/Ô/ˆCà Œ=Ô ð Ø×+Ò+Ø�u˜e S¨)ñôˆEð ×Ò˜e T¨3Ñ/Ô/Ð/؈ˆdŒh‰ˆˆr;cóN—|jjD]}|||||p|j¦«}Œ|Sr=)r1r“r©r4rrr›rZÚpreviousrrùs r9r/z&ScalarAttributeImpl.fire_replace_eventnsA€Ø”-Ô#ð ð ˆBØ�BØ�u˜h¨ Ð(H°TÔ5HñôˆEˆEðˆ r;cóL—|jjD]}||||p|j¦«ŒdSr=)r1r r©r4rrr›rZrrùs r9r!z%ScalarAttributeImpl.fire_remove_eventus?€Ø”-Ô&ð >ð >ˆBØ ˆBˆu�e˜YÐ<¨$Ô*<Ñ =Ô =Ð =Ð =ð >ð >r;có4—|jjdjdS)Nr)r‰Úcolumnsr}r?s r9r}zScalarAttributeImpl.typeys€à Œ Ô˜aÔ Ô%Ð%Ð%Ð%r;)r~r‹rŒr�rÓrBr>Ú collectionÚdynamicrÈr:r–rrEr“r/r!r‰r}Ú __classcell__©r\s@r9rr)såø€€€€€ØBÐBà$(Ð!Ø€LØÐØ€JØ€GàB€Ið4ð4ð4ð4ð4ð KðKðKð&1<ð Kð Kð Kð Kð$ØØ ð ð ð ð ð,ððð>ð>ð>ðð&ð&ñ„Xð&ð&ð&ð&ð&r;rcóZ—eZdZdZdZdZdZdZdZd„Z e fd„Z e fd„Z e ddfd „Zd „Zd „ZdS) ÚScalarObjectAttributeImplz•represents a scalar-holding InstrumentedAttribute, where the target object is also instrumented. Adds events to delete/set operations. FTrIcó¼—|jjr.| ||ttzt z¬¦«}n5| ||t tz t ztz¬¦«}|  ||||j ¦«|  |j t¦«}|tur"|tur|j €td|z¦«‚dSdSdS)Nrr )r1r3r™rrrrr rr!rrr+rrr{r$s r9r–z ScalarObjectAttributeImpl.delete�s÷€Ø Œ=Ô (ð Ø—(’(ØØÝ/Ýñå(ñ)ðñôˆCˆCð—(’(ØØÝ(­7Ñ2Ý(ñ)åñðñôˆCð ×Ò˜u e¨S°$Ô2DÑEÔEÐEà—9’9˜TœX¥xÑ0Ô0ˆð �Ð Ð ØÕ,Ð,Ð,Ø” Ð!å Ð!BÀTÑ!IÑJÔJÐ Jð !Ð Ø,Ð,Ø!Ð!r;có—|j|vr't ||||j¦«S|tzr |tz}| |||¬¦«}|t urt St |||¦«Sr)r+r(Úfrom_object_attributer r™rr*r+s r9rEz%ScalarObjectAttributeImpl.get_history­r-r;cóŠ—|j|vr||j}n%|tzr| |||¬¦«}ngS|�%|tur|turt |¦«|fg}ndg}|j|jvrN|j|j}|�:|tur1|tur(||ur$| t |¦«|f¦«|S)Nr)NN)r+r r™rrr rýr )r4rrr›rGr,rúÚoriginals r9röz)ScalarObjectAttributeImpl.get_all_pending¹sñ€Ø Œ8�uРРؘDœH”oˆGˆGØ •|Ñ #ð Ø—h’h˜u e°W�hÑ=Ô=ˆGˆGàˆIð Ð ØÕ0Ð0Ð0Ø�yÐ(Ð(å" 7Ñ+Ô+¨WÐ5Ð6ˆCˆCà�.ˆCà Œ8�uÔ,Ð ,Ð ,ØÔ,¨T¬XÔ6ˆHàÐ$ØÕ$5Ð5Ð5Ø¥IÐ-Ð-Ø GÐ+Ð+ð— ’ �N¨8Ñ4Ô4°hÐ?Ñ@Ô@Ð@؈ r;Nc óÀ—|jjr.| ||ttzt z¬¦«}n5| ||t tz t ztz¬¦«}|�I|tur@||ur<|rdStdt|¦«›dt|¦«›d|j ›d�¦«‚| |||||¦«}|||j <dS)z'Set a value on the given InstanceState.rNzObject z not associated with z on attribute 'ú')r1r3r™rrrrr rrÚ ValueErrorrr!r+r/r0s r9r“zScalarObjectAttributeImpl.set×s€ð Œ=Ô (ð Ø—(’(ØØÝ/Ýñå(ñ)ðñôˆCˆCð—(’(ØØÝ(­7Ñ2Ý(ñ)åñðñôˆCð Ð !ØÕ,Ð,Ð,Ø Ð$Ð$àð Ø�å �jå# IÑ.Ô.Ð.Ð.µ ¸%Ñ0@Ô0@Ð0@Ð0@À$Ä(À(À(ðLñôðð ×'Ò'¨¨u°e¸SÀ)ÑLÔLˆØˆˆdŒh‰ˆˆr;cóÔ—|jr&|�$| t|¦«|d¦«|jjD]}||||p|j¦«Œ| |||¦«dS)NF)rÍrðr r1r rr"r5s r9r!z+ScalarObjectAttributeImpl.fire_remove_events„€Ø Ô ð C Ð 1Ø × Ò �n¨UÑ3Ô3°U¸EÑ BÔ BÐ Bà”-Ô&ð >ð >ˆBØ ˆBˆu�e˜YÐ<¨$Ô*<Ñ =Ô =Ð =Ð =à ×Ò˜e T¨5Ñ1Ô1Ð1Ð1Ð1r;cóV—|jr9||ur5|dttfvr$| t |¦«|d¦«|jjD]}|||||p|j¦«}Œ| |||¦«|jr&|�$| t |¦«|d¦«|S©NFT) rÍrrrðr r1r“rr"r2s r9r/z,ScalarObjectAttributeImpl.fire_replace_event sÞ€Ø Ô ð JؘuÐ$Ð$¨ØÝ!Ýð:ð*ð*ð ×!Ò!¥.°Ñ":Ô":¸EÀ5ÑIÔIÐIà”-Ô#ð ð ˆBØ�BØ�u˜h¨ Ð(H°TÔ5HñôˆEˆEð ×Ò˜e T¨8Ñ4Ô4Ð4à Ô ð FØÐ Ø×!Ò!¥.°Ñ"7Ô"7¸ÀÑEÔEÐEàˆ r;)r~r‹rŒr�rÓrBr>r8rÈr–rrErrör“r!r/rIr;r9r=r=~sÄ€€€€€ððð%*Ð!Ø€LØÐØ€Jà€IðKðKðKð@1<ð Kð Kð Kð Kð5JðððððHØØ ð* ð* ð* ð* ðX2ð2ð2ðððððr;r=cóʇ—eZdZdZdZdZdZdZdZdZ dˆfd„ Z d„Z e fd„Z efd „Zd „Zd „Zd „Zd „Zd„Zd„Ze fd„Ze fd„Ze fd„Zde ddfd„Zd„Zd„Zde fd„ZˆxZS)ÚCollectionAttributeImpla«A collection-holding attribute that instruments changes in membership. Only handles collections of instrumented objects. InstrumentedCollectionAttribute holds an arbitrary, user-specified container object (defaulting to a list) and brokers access to the CollectionAdapter, a "view" onto that object that presents consistent bag semantics to the orm layer independent of the user data implementation. FT)ÚcopyÚcollection_factoryrrÚ_bulk_replace_tokenÚ_duck_typed_asNc  ó •—tt|¦«j||||f||| dœ| ¤Ž|€|j}||_||_t |t¦«|_t |t¦«|_ t |t¦«|_ tj| ¦«¦«|_t!|jdd¦«r>t#j|d¦«d„¦«} t#j|d¦«d„¦«} dSdS)N)rÍrÙrÚÚ _sa_linkerÚinit_collectioncó0—| |¦«dSr=©rP©Útargetr8Úcollection_adapters r9Úlinkz.CollectionAttributeImpl.__init__..linkcs€à×%Ò%Ð&8Ñ9Ô9Ð9Ð9Ð9r;Údispose_collectioncó0—| d¦«dSr=rSrTs r9Úunlinkz0CollectionAttributeImpl.__init__..unlinkgs€à×%Ò% dÑ+Ô+Ð+Ð+Ð+r;)rrJr:Ú_CollectionAttributeImpl__copyrKrLr¾Ú OP_APPENDrrrÚOP_BULK_REPLACErMr%Úduck_type_collectionrNrzr#Ú listens_for)r4r*r+rÌr1Ú typecallablerÍrÙÚ copy_functionrÚrjrWrZr\s €r9r:z CollectionAttributeImpl.__init__>sIø€ð 6�Õ% tÑ,Ô,Ô5Ø Ø Ø Ø ð ð $ØØ-ð ð ðð ð ð ð Ð Ø œKˆMØ!ˆŒ Ø".ˆÔÝ" 4­Ñ3Ô3ˆÔÝ" 4­Ñ3Ô3ˆÔÝ#(¨­Ñ#?Ô#?ˆÔ Ý"Ô7Ø × #Ò #Ñ %Ô %ñ ô ˆÔõ �4Ô*¨L¸$Ñ ?Ô ?ð ,å Ô ˜tÐ%6Ñ 7Ô 7ð :ð :ñ8Ô 7ð :õÔ ˜tÐ%9Ñ :Ô :ð ,ð ,ñ;Ô :ð ,ð ,ð ,ð ,ð ,r;có>—d„tj|¦«D¦«S)Ncó—g|]}|‘ŒSrIrI)Ú.0Úys r9ú z2CollectionAttributeImpl.__copy..ls€Ð@Ð@Ð@�a�Ð@Ð@Ð@r;)rrV)r4Úitems r9Ú__copyzCollectionAttributeImpl.__copyks!€Ø@Ð@�;Ô9¸$Ñ?Ô?Ð@Ñ@Ô@Ð@r;cóŠ—| |||¬¦«}|turtSt |||¦«Sr)r™rr*r(Úfrom_collectionr+s r9rEz#CollectionAttributeImpl.get_historynsC€Ø—(’(˜5 %°�(Ñ9Ô9ˆØ Õ'Ð 'Ð 'Ý Ð å×*Ò*¨4°¸Ñ@Ô@Ð @r;c󒇇 —|j|vrgS||j}t|d¦«}|j|jvr„|j|j}|ttfvrbd„|D¦«}d„|D¦«}t |¦«Št |¦«Š ˆ fd„|D¦«ˆ fd„|D¦«zˆfd„|D¦«zSd„|D¦«S)NÚ _sa_adaptercó<—g|]}|durt|¦«pd|f‘ŒSr=r ©rdÚcs r9rfz;CollectionAttributeImpl.get_all_pending..�sC€ð"ð"ð"àð˜t�mÐ:­¸Ñ):Ô):ÐB¸dÀAÐFð"ð"ð"r;có<—g|]}|durt|¦«pd|f‘ŒSr=r rns r9rfz;CollectionAttributeImpl.get_all_pending..…sC€ð#ð#ð#àð˜t�mÐ:­¸Ñ):Ô):ÐB¸dÀAÐFð#ð#ð#r;có&•—g|] \}}|‰v¯ ||f‘ŒSrIrI©rdÚsÚoÚ original_sets €r9rfz;CollectionAttributeImpl.get_all_pending..Žs6ø€ðððá ˜A˜qØ LÐ0Ð0ð˜A˜à0Ð0Ð0r;có&•—g|] \}}|‰v¯ ||f‘ŒSrIrIrrs €r9rfz;CollectionAttributeImpl.get_all_pending..“s+ø€ÐNÐNÐN¡$ ! Q¸AÀÐ.”s6ø€ðððá ˜A˜qØ KÐ/Ð/ð˜A˜à/Ð/Ð/r;có0—g|]}t|¦«|f‘ŒSrIr )rdrts r9rfz;CollectionAttributeImpl.get_all_pending..›s%€Ð8Ð8Ð8¨1• Ñ"Ô" AÐ&Ð8Ð8Ð8r;)r+rzrýrrÚdict) r4rrr›rGr,rBÚcurrent_statesÚoriginal_statesryrus @@r9röz'CollectionAttributeImpl.get_all_pendingusEøø€ð Œ8˜5РР؈Ià˜œ”/ˆÝ˜' =Ñ1Ô1ˆà Œ8�uÔ,Ð ,Ð ,ØÔ,¨T¬XÔ6ˆHØ¥­)Ð4Ð4Ð4ð"ð"à$ð"ñ"ô"�ð#ð#à%ð#ñ#ô#�õ # >Ñ2Ô2� Ý# OÑ4Ô4� ððððà$2ðñôð OÐNÐNÐN¨.ÐNÑNÔNñ Oð ðððà$3ðñôñ ð ð9Ð8°Ð8Ñ8Ô8Ð8r;cóà—|jjD]}||||p|j¦«}Œ| ||td¦«|jr&|�$| t|¦«|d¦«|Sr))r1r rr"rrÍrðr r5s r9Úfire_append_eventz)CollectionAttributeImpl.fire_append_event�s…€Ø”-Ô&ð Fð FˆBØ�B�u˜e YÐ%D°$Ô2DÑEÔEˆEˆEà ×Ò˜e T­9°dÑ;Ô;Ð;à Ô ð B Ð 1Ø × Ò �n¨UÑ3Ô3°U¸DÑ AÔ AÐ Aàˆ r;có@—| ||td¦«dS)afA special event used for pop() operations. The "remove" event needs to have the item to be removed passed to it, which in the case of pop from a set, we don't have a way to access the item before the operation. the event is used for all pop() operations (even though set.pop is the one where it is really needed). TN)r"r)r4rrr›rs r9Úfire_pre_remove_eventz-CollectionAttributeImpl.fire_pre_remove_event¨s$€ð ×Ò˜e T­9°dÑ;Ô;Ð;Ð;Ð;r;cóà—|jr&|�$| t|¦«|d¦«|jjD]}||||p|j¦«Œ| ||td¦«dSrH)rÍrðr r1r rr"rr5s r9r!z)CollectionAttributeImpl.fire_remove_event³s†€Ø Ô ð C Ð 1Ø × Ò �n¨UÑ3Ô3°U¸EÑ BÔ BÐ Bà”-Ô&ð >ð >ˆBØ ˆBˆu�e˜YÐ<¨$Ô*<Ñ =Ô =Ð =Ð =à ×Ò˜e T­9°dÑ;Ô;Ð;Ð;Ð;r;cóÄ—|j|vrdS| ||td¦«| ||j¦«}| ¦«||j=dSr))r+r"rÚget_collectionr{Úclear_with_event)r4rrr›r8s r9r–zCollectionAttributeImpl.delete¼sf€Ø Œ8˜5Ð Ð Ø ˆFà ×Ò˜e T­9°dÑ;Ô;Ð;à×(Ò(¨°´ Ñ;Ô;ˆ Ø×#Ò#Ñ%Ô%Ð%ð �$”(ˆOˆOˆOr;cóJ—| |¦«\}}|||j<|S)z3Initialize this attribute with an empty collection.)Ú_initialize_collectionr+)r4rrr›Ú_Ú user_datas r9rûz"CollectionAttributeImpl.initializeÉs,€ð×2Ò2°5Ñ9Ô9‰ ˆˆ9Ø#ˆˆdŒh‰ØÐr;có”—|j |j||j¦«\}}|j |||¦«||fSr=)r7Úinitialize_collectionr+rLr1rQ)r4rrÚadapterr8s r9r‡z.CollectionAttributeImpl._initialize_collectionÐsQ€à#œm×AÒAØ ŒH�e˜TÔ4ñ ô ш�ð Œ ×%Ò% e¨Z¸ÑAÔAÐAà˜ Ð"Ð"r;có(—| |||¬¦«}|turZ| ||||¦«}|j|vs Jd¦«‚| |j¦« |¦«dS| ||¦«dS©Nrz,Collection was loaded during event handling.)r„rrr+Ú_get_pending_mutationr Úappend_with_event©r4rrr›rZrrGr8s r9r zCollectionAttributeImpl.appendÚs¥€Ø×(Ò(¨°¸wÐ(ÑGÔGˆ Ø Õ*Ð *Ð *Ø×*Ò*¨5°%¸À ÑJÔJˆEà” Ð%Ð%Ð%Ø=ñ&Ô%Ð%à × 'Ò '¨¬Ñ 1Ô 1× 8Ò 8¸Ñ ?Ô ?Ð ?Ð ?Ð ?à × (Ò (¨° Ñ :Ô :Ð :Ð :Ð :r;có2—| ||j|¬¦«}|turZ| ||||¦«|j|vs Jd¦«‚| |j¦« |¦«dS| ||¦«dSrŽ)r„r{rr!r+r�r Úremove_with_eventr‘s r9r zCollectionAttributeImpl.removeås¨€Ø×(Ò(¨°´ ÀGÐ(ÑLÔLˆ Ø Õ*Ð *Ð *Ø × "Ò " 5¨%°¸ Ñ BÔ BÐ Bà” Ð%Ð%Ð%Ø=ñ&Ô%Ð%à × 'Ò '¨¬Ñ 1Ô 1× 8Ò 8¸Ñ ?Ô ?Ð ?Ð ?Ð ?à × (Ò (¨° Ñ :Ô :Ð :Ð :Ð :r;cóx— | |||||¬¦«dS#tttf$rYdSwxYwr)r rErÚ IndexErrorrs r9rzCollectionAttributeImpl.popðsT€ð ð �KŠK˜˜u e¨YÀˆKÑ HÔ HÐ HÐ HÐ HøÝ�H¥jÐ1ð ð ð Ø ˆDˆDð øøøs ‚ž9¸9cóÄ—|x}} | |¦«\} } |rí| j�|  |¦«}nÐtj|¦«} |j} | | ur4|durdp |jj}|jj}td|›d|›d�¦«‚t|d¦«r|  ¦«}nX| tur@tj r|  ¦«}n.t|d|j ¦«¦«}nt|¦«}t|¦«}|j}|j |||¦«| ||t(¬¦«}|t*ur| ||¦«}n|| urdS| |||d¦«|j}| ||j<t5j||| |¬ ¦«|`|j |||¦«dS) NÚNonezIncompatible collection type: z is not z-likeÚ _sa_iteratorÚ itervaluesrT)r)r‡Ú _converterr%r^rNr\r~Ú TypeErrorÚhasattrr˜r{Úpy3kÚvaluesrzÚiterÚlistrMr1Ú bulk_replacer™rrrûr"rlr+rrX)r4rrr›rZrrGrÚ_adaptÚiterableÚ orig_iterableÚnew_collectionr‰Ú setting_typeÚreceiving_typeÚgivenÚwantedÚ new_valuesÚevtr%Úold_collections r9r“zCollectionAttributeImpl.setùs9€ð$)Ð(ˆ�=ð%)×$?Ò$?ÀÑ$FÔ$FÑ!ˆ˜ Ø ð .ØÔ(Ð4Ø)×4Ò4°XÑ>Ô>��å#Ô8¸ÑBÔB� Ø!%Ô!4�à ~Ð5Ð5à  DÐ(ð#Ø"ð7à#Ô-Ô6ðð "Ô0Ô9�FÝ#˜)à ˜5˜5 & & &ð*ñôðõ˜8 ^Ñ4Ô4ð .Ø'×4Ò4Ñ6Ô6�H�HØ!¥TÐ)Ð)Ý”yðØ#+§?¢?Ñ#4Ô#4˜˜ð$¥7Ø$ l°H´Oñ$ô$ñ$ô$˜˜õ $ H™~œ~�Hݘ(‘^”^ˆ àÔ&ˆà Œ ×"Ò" 5¨*°cÑ:Ô:Ð:à�hŠh�u˜eÕ-DˆhÑEÔEˆØ Õ#Ð #Ð #Ø—/’/ %¨Ñ/Ô/ˆCˆCØ �MÐ !Ð !ð ˆFð ×Ò˜e T¨3°Ñ5Ô5Ð5àœˆà#ˆˆdŒh‰åÔ Ø ˜¨À#ð ñ ô ð ð ˆOØ Œ ×(Ò(¨°°^ÑDÔDÐDÐDÐDr;có4—t|d¦«}d|_dS)NrlT)rzÚ invalidated)r4r8rŒs r9Ú_invalidate_collectionz.CollectionAttributeImpl._invalidate_collectionDs€Ý˜* mÑ4Ô4ˆØ"ˆÔÐÐr;cóÈ—| |¦«\}}|r| |¦«||j|j<| ||jg¦«|j|jvry| |||d¦«|j |j¦«}|j}|j }|D]} |  | ¦«Œ|D]} |  | ¦«Œ|S)z=Set an attribute value on the given instance and 'commit' it.T) r‡Úappend_multiple_without_eventr{r+rÚ_pending_mutationsr"rÚ added_itemsÚ deleted_itemsÚappend_without_eventÚremove_without_event) r4rrr›rZr8r‰ÚpendingÚaddedÚremovedrgs r9rz+CollectionAttributeImpl.set_committed_valueHs€ð!%× ;Ò ;¸EÑ BÔ Bш �Ià ð <Ø × 4Ò 4°UÑ ;Ô ;Ð ;à(ˆŒ �4”8Ñà � Š �e˜dœh˜ZÑ(Ô(Ð(à Œ8�uÔ/Ð /Ð /ð × !Ò ! %¨¨y¸$Ñ ?Ô ?Ð ?àÔ.×2Ò2°4´8Ñ<Ô<ˆGØÔ'ˆEØÔ+ˆGØð 6ð 6�Ø×/Ò/°Ñ5Ô5Ð5Ð5Øð 6ð 6�Ø×/Ò/°Ñ5Ô5Ð5Ð5àÐr;cól—|€#| |||¬¦«}|tur|St|d¦«S)z‰Retrieve the CollectionAdapter associated with the given state. Creates a new CollectionAdapter if one does not exist. Nrrl)r™rrz)r4rrr›r‰rGs r9r„z&CollectionAttributeImpl.get_collectioncsC€ð Ð ØŸš ¨°w˜Ñ?Ô?ˆIØÕ-Ð-Ð-Ø Ð å�y -Ñ0Ô0Ð0r;)NFNNN)r~r‹rŒr�rÓrBr>r8r9rÈr:r[rrErrörr�r!r–rûr‡r r rr“r¯rr„r:r;s@r9rJrJ#sÓø€€€€€ð ð ð%*Ð!Ø€LØÐØ€JØ€Gð€IðØØØØð+,ð+,ð+,ð+,ð+,ð+,ðZAðAðAð1<ðAðAðAðAð5Jð&9ð&9ð&9ð&9ðP ð ð ð <ð <ð <ð<ð<ð<ð ð ð ðððð#ð#ð#ð>Ið ;ð ;ð ;ð ;ð>Ið ;ð ;ð ;ð ;ð;FðððððØØ ØðIEðIEðIEðIEðV#ð#ð#ðððð8'+°Kð 1ð 1ð 1ð 1ð 1ð 1ð 1ð 1r;rJcó ‡‡‡‡‡‡—‰jjЉjŠˆfd„Šˆˆˆˆfd„}ˆˆˆfd„}ˆˆˆfd„}‰rtj‰d|dd¬¦«ntj‰d|dd¬¦«tj‰d |dd¬¦«d S) z6Apply listeners to synchronize a two-way relationship.c ó~•—tdt|¦«›d|j›d|j›d‰jj›d� ¦«‚)Nz:Bidirectional attribute conflict detected: Passing object z to attribute "z(" triggers a modify event on attribute "z" via the backref "z".)rEr!rÀr,)Ú child_staterÚ child_implr¯s €r9Ú_acceptable_key_errz.backref_listeners.._acceptable_key_err�sUø€Ýˆjõ ˜+Ñ&Ô&Ð&Ð&ØÔ&Ð&Ð&ØÔ'Ð'Ð'Ø”Ô+Ð+Ð+ð ñ  ô  ð r;có–•—||ur|S|�™|tur�|tur‡t|¦«t|¦«}}|j‰j}|js|js|j}n|j }||ur6|  |||  ¦«‰j t¬¦«|�¤t|¦«t|¦«} }|j‰j} |j‰ur|j| jur ‰ ||| ¦«| j } | jr| jnd} || ur5|| ur1|  || |  ¦«|t¬¦«|Sr)rrr r r7r,r8r9rrrrêrrrÀrMr )rrÚchildÚoldchildrÚ old_stateÚold_dictr,Úcheck_recursive_tokenr½Ú child_dictr¾Úcheck_append_tokenÚcheck_bulk_replace_tokenr¿r+Ú parent_implrÀs €€€€r9Ú"emit_backref_from_scalar_set_eventz=backref_listeners..emit_backref_from_scalar_set_event�s¶ø€Ø �uРР؈Là Ð ØÕ 1Ð1Ð1Ø¥ Ð)Ð)õ ˜xÑ(Ô(ݘhÑ'Ô'ð ˆIðÔ$ SÔ)Ô.ˆDð”?ð ;¨4¬<ð ;Ø(,Ô(;Ð%Ð%à(,Ô(:Ð%àÐ 5Ð5Ð5Ø—’ØØØ—I’I‘K”KØÔ-Ý,ð ñôðð Ð å˜uÑ%Ô%ݘeÑ$Ô$ð$ˆKð%Ô,¨SÔ1Ô6ˆJðÔ&¨lÐ:Ð:ØÔ*°*Ô2IÐIÐIà#Ð# E¨9°jÑAÔAÐAð",Ô!9Ð ðÔ(ð� Ô.Ð.àð %ðÐ!3Ð3Ð3ØÐ%=Ð=Ð=à×!Ò!ØØØ—I’I‘K”KØÝ,ð "ñôððˆ r;cóX•—|€dSt|¦«t|¦«}}|j‰ j}|j‰ ur|j|jur ‰|||¦«|j}|jr|jnd}||ur5||ur1| |||  ¦«|t¬¦«|Sr) r r r7r,rÀrr8rMr rêr) rrrÁrr½rÆr¾rÇrÈr¿r+rÀs €€€r9Ú)emit_backref_from_collection_append_eventzDbackref_listeners..emit_backref_from_collection_append_eventÐsäø€Ø ˆ=Ø ˆFå"0°Ñ"7Ô"7½ÀuÑ9MÔ9M�Zˆ Ø Ô(¨Ô-Ô2ˆ ð Ô "¨,Ð 6Ð 6ØÔ&¨jÔ.EÐEÐEà Ð   y°*Ñ =Ô =Ð =ð(Ô5Ðà.8Ô.CÐ MˆJÔ *Ð *Èð !ð Ð/Ð /Ð /ØÐ!9Ð9Ð9à × Ò ØØØ— ’ ‘ ” ØÝ(ð ñ ô ð ðˆ r;cóè•—|�ä|turÝ|turÖt|¦«t|¦«}}|j‰ j}|js |js|j}|j }‰ o‰ j }n|j}|jr|j nd}d}||urd||urb|r%tj |j ‰ j|¦«s=| ||| ¦«|t"¬¦«dSdSdSdSdSdSdS)NFr)rrr r r7r,r8r9rrrMr%Ú has_dupesr{r+rrêr) rrrÁrr½rÆr¾Úcheck_remove_tokenÚcheck_replace_tokenÚcheck_for_dupes_on_remover+rÉÚuselists €€€r9Ú)emit_backref_from_collection_remove_eventzDbackref_listeners..emit_backref_from_collection_remove_eventðsoø€à Ð ØÕ.Ð.Ð.Ø�YÐ&Ð&õ˜uÑ%Ô%ݘeÑ$Ô$ð$ˆKð%Ô,¨SÔ1Ô6ˆJðÔ(ð 2°Ô1Cð 2Ø%/Ô%=Ð"Ø&0Ô&?Ð#Ø,3Ð,O¸KÔÔ.€LØ”.€Kð  ð  ð  ð  ð  ð?ð?ð?ð?ð?ð?ð?ð?ðBððððððð@+ð+ð+ð+ð+ð+ð+ðZð Ý Œ Ø Ø Ø 5ØØð  ñ ô ð ð õ Œ Ø Ø Ø .ØØð  ñ ô ð õ „LØØØ1ØØ ð ñôðððr;Ú NO_HISTORYr(©r¸Ú unchangedÚdeletedcó‚—eZdZdZd„ZeZd„Zd„Zd„Zd„Z d„Z d„Z e d „¦«Z e d „¦«Ze d „¦«Zd S) r(aA 3-tuple of added, unchanged and deleted values, representing the changes which have occurred on an instrumented attribute. The easiest way to get a :class:`.History` object for a particular attribute on an object is to use the :func:`_sa.inspect` function:: from sqlalchemy import inspect hist = inspect(myobject).attrs.myattribute.history Each tuple member is an iterable sequence: * ``added`` - the collection of items added to the attribute (the first tuple element). * ``unchanged`` - the collection of items that have not changed on the attribute (the second tuple element). * ``deleted`` - the collection of items that have been removed from the attribute (the third tuple element). có—|tkSr=)r*r?s r9Ú__bool__zHistory.__bool__Xs €Ø•}Ò$Ð$r;cóH—t|jp |jp|j¦« S)zhReturn True if this :class:`.History` has no changes and no existing, unchanged state. )Úboolr¸rÚrÙr?s r9Úemptyz History.empty]s%€õ ˜œÐ3 t¤|ÐF¸¼ÑGÔGÐGÐGr;có<—|jpg|jpgz|jpgzS)z3Return a collection of added + unchanged + deleted.rØr?s r9Úsumz History.sumes+€ðŒZÐ ˜2 $¤.Ð"6°BÑ 7¸4¼<Ð;MÈ2Ñ Nð r;có(—|jpg|jpgzS)z)Return a collection of added + unchanged.)r¸rÙr?s r9Ú non_deletedzHistory.non_deletedls€ð” Ð ˜b T¤^Ð%9°rÑ:Ð:r;có(—|jpg|jpgzS)z+Return a collection of unchanged + deleted.)rÙrÚr?s r9Ú non_addedzHistory.non_addedqs€ð”Ð$ "¨¬Ð);¸Ñ<Ð.}ó>€ð ð ð àð˜$�Ð5¥N°1Ñ$5Ô$5Ð=¸ð ð ð r;có8—g|]}|durt|¦«pd‘ŒSr=r rns r9rfz$History.as_state..�rër;có8—g|]}|durt|¦«pd‘ŒSr=r rns r9rfz$History.as_state..…rër;)r(r¸rÙrÚr?s r9Úas_statezHistory.as_state{sn€Ýð ð àœð ñ ô ð ð àœð ñ ô ð ð àœð ñ ô ñ  ô  ð r;có¢—|j |jt¦«}|tur$|tur |ddd¦«S|d|gd¦«S| ||¦«dur|d|gd¦«St |¦«tvrd}t |¦«tvrd}n|g}|tur |dd|¦«S||gd|¦«S)NrIT)rýr™r+Ú _NO_HISTORYrrÑrçÚ_NO_STATE_SYMBOLS©rar¯rrr,rBrÚs r9r)zHistory.from_scalar_attribute‹sú€àÔ(×,Ò,¨Y¬]½KÑHÔHˆà •{Ð "Ð "Ø�)Ð#Ð#Ø�s˜2˜r 2‘”Ð&à�s˜2 ˜y¨"Ñ-Ô-Ð-à × Ò  ¨Ñ 2Ô 2°dÐ :Ð :Ø�3�r˜G˜9 bÑ)Ô)Ð )õ�(‰|Œ|Õ0Ð0Ð0Ø�õ�g‘;”;Õ"3Ð3Ð3Ø"�Gøà#˜*�Ø�)Ð#Ð#Ø�s˜2˜r 7Ñ+Ô+Ð+à�s˜G˜9 b¨'Ñ2Ô2Ð2r;có´—|j |jt¦«}|tur-|tus |t ur |ddd¦«S|d|gd¦«S||ur|t ur|d|gd¦«St |¦«tvs|€d}t |¦«tvrd}n|g}|tus |t ur |dd|¦«S||gd|¦«S)NrI)rýr™r+rðrrrçrñròs r9r@zHistory.from_object_attributeªs €àÔ(×,Ò,¨Y¬]½KÑHÔHˆà •{Ð "Ð "Ø�(Ð"Ð" gµÐ&:Ð&:Ø�s˜2˜r 2‘”Ð&à�s˜2 ˜y¨"Ñ-Ô-Ð-Ø ˜Ð Ð  WµIÐ%=Ð%=Ø�3�r˜G˜9 bÑ)Ô)Ð )õ�(‰|Œ|Õ0Ð0Ð0°HÐ4DØ�õ�g‘;”;Õ"3Ð3Ð3Ø"�Gøà#˜*�Ø�(Ð"Ð" gµÐ&:Ð&:Ø�s˜2˜r 7Ñ+Ô+Ð+à�s˜G˜9 b¨'Ñ2Ô2Ð2r;c󇇗|j |jt¦«}|tus |t ur |ddd¦«St |d¦«}|tt fvr|t|¦«dd¦«S|tur|dt|¦«d¦«Sd„|D¦«}d„|D¦«}t|¦«Št|¦«Š|ˆfd„|D¦«ˆfd„|D¦«ˆfd„|D¦«¦«S)NrIrlcó<—g|]}|durt|¦«pd|f‘ŒSr=r rns r9rfz+History.from_collection..ÖsC€ðððàð˜4�-Ð6¥^°AÑ%6Ô%6Ð>¸$ÀÐBðððr;có<—g|]}|durt|¦«pd|f‘ŒSr=r rns r9rfz+History.from_collection..ÚsC€ðððàð˜4�-Ð6¥^°AÑ%6Ô%6Ð>¸$ÀÐBðððr;có"•—g|] \}}|‰v¯ |‘Œ SrIrIrrs €r9rfz+History.from_collection..ãs'ø€ÐGÐGÐG‘t�q˜!°¸,Ð1FÐ1F�Ð1FÐ1FÐ1Fr;có"•—g|] \}}|‰v¯ |‘Œ SrIrIrrs €r9rfz+History.from_collection..äs'ø€ÐCÐCÐC‘t�q˜!°°lÐ1BÐ1B�Ð1BÐ1BÐ1Br;có"•—g|] \}}|‰v¯ |‘Œ SrIrIrxs €r9rfz+History.from_collection..ås'ø€ÐGÐGÐG‘t�q˜!°!¸;Ð2FÐ2F�Ð2FÐ2FÐ2Fr;) rýr™r+rðrrrzr r{) rar¯rrr,rBr|r}ryrus @@r9rjzHistory.from_collectionÈsTøø€àÔ(×,Ò,¨Y¬]½KÑHÔHˆà •hÐ Ð  '­YÐ"6Ð"6Ø�3�r˜2˜r‘?”?Ð "å˜' =Ñ1Ô1ˆØ �¥)Ð,Ð ,Ð ,Ø�3•t˜G‘}”} b¨"Ñ-Ô-Ð -Ø �Ð $Ð $Ø�3�r�4 ™=œ=¨"Ñ-Ô-Ð -ððà ðñôˆNððà!ðñôˆOõ ˜~Ñ.Ô.ˆKÝ Ñ0Ô0ˆLà�3ØGÐGÐGÐG˜~ÐGÑGÔGØCÐCÐCÐC˜~ÐCÑCÔCØGÐGÐGÐG˜ÐGÑGÔGñôð r;N)r~r‹rŒr�rÝÚ __nonzero__ràrârärærèrîÚ classmethodr)r@rjrIr;r9r(r(?s €€€ððð0%ð%ð%ð€KðHðHðHð ð ð ð;ð;ð;ð =ð=ð=ð 0ð0ð0ð  ð ð ð ð3ð3ñ„[ð3ð<ð3ð3ñ„[ð3ð:ððñ„[ðððr;có¼—|durtjd¦«t}n|durtjd¦«t}t t |¦«||¦«S)a Return a :class:`.History` record for the given object and attribute key. This is the **pre-flush** history for a given attribute, which is reset each time the :class:`.Session` flushes changes to the current database transaction. .. note:: Prefer to use the :attr:`.AttributeState.history` and :meth:`.AttributeState.load_history` accessors to retrieve the :class:`.History` for instance attributes. :param obj: an object whose class is instrumented by the attributes package. :param key: string attribute name. :param passive: indicates loading behavior for the attribute if the value is not already present. This is a bitflag attribute, which defaults to the symbol :attr:`.PASSIVE_OFF` indicating all necessary SQL should be emitted. .. seealso:: :attr:`.AttributeState.history` :meth:`.AttributeState.load_history` - retrieve history using loader callables if the value is not locally present. TzNPassing True for 'passive' is deprecated. Use attributes.PASSIVE_NO_INITIALIZEFzFPassing False for 'passive' is deprecated. Use attributes.PASSIVE_OFF)r%Úwarn_deprecatedrrÚget_state_historyr )rêr+rGs r9rErEìsw€ðD�$€€Ý Ôð 3ñ ô ð õ(ˆˆØ �EÐ Ð Ý Ôð 6ñ ô ð õˆå �^¨CÑ0Ô0°#°wÑ ?Ô ?Ð?r;có.—| ||¦«Sr=)rE)rrr+rGs r9rþrþs€Ø × Ò ˜S 'Ñ *Ô *Ð*r;Fcól—t|¦«}t|¦«}| |||¦«S)ÚTODO)rr Ú has_parent)rarêr+ror7rrs r9rr"s4€å˜sÑ#Ô#€GÝ ˜3Ñ Ô €EØ × Ò ˜e S¨*Ñ 5Ô 5Ð5r;c óΗ| dd¦«}| dd¦«}| dd¦«}t|||||¬¦«}t||fi|¤Ž|S)Nr-r5r¥)r¥)rÚregister_descriptorÚregister_attribute_impl)r*r+rr-r5r¥Údescs r9Úregister_attributer)sp€Ø—’˜  dÑ+Ô+€JØ—6’6˜.¨$Ñ/Ô/€LØ �&Š&�˜Ñ Ô €CÝ ˜v s¨J¸ È#Ð NÑ NÔ N€DݘF CÐ.Ð.¨2Ð.Ð.Ð.Ø €Kr;c óæ—t|¦«}|r4| dd¦«} | || pt¦«} n| dd¦«} ||j} |r |||| | fi|¤Ž} n8|rt |||| fd| i|¤Ž} n#|rt |||| fi|¤Ž} nt|||| fi|¤Ž} | ||_|rt||||¦«|  |¦«||S)Nr`) rrÚinstrument_collection_classr r1rJr=rr,rÖÚpost_configure_attribute) r*r+rÒrÌÚ useobjectÚ impl_classÚbackrefrr7Úfactoryr`r1r,s r9rr2sd€õ˜vÑ&Ô&€GØð4Ø—&’&˜¨Ñ.Ô.ˆØ×:Ò:Ø ���Dñ ô ˆ ˆ ð—v’v˜n¨dÑ3Ô3ˆ à�sŒ|Ô$€Hàð K؈z˜& # |°XÐDÐDÀÐDÐDˆˆØ ð KÝ&Ø �C˜ Hð ð Ø;Gð ØKMð 𠈈ð ðKÝ(Ø �C˜ Hð ð Ø02ð 𠈈õ# 6¨3° ¸8ÐJÐJÀrÐJÐJˆà€GˆC„LÔàð:ݘ' #œ,¨°Ñ9Ô9Ð9à ×$Ò$ SÑ)Ô)Ð)Ø �3Œ<Ðr;có„—t|¦«}t||||¬¦«}||_| ||¦«|S)N)r-r5)rr‘r�Úinstrument_attribute)r*r+r-r5r¥r7r¡s r9rr^sT€õ˜vÑ&Ô&€Gå&Ø�  ¸ðñô€Jð€JÔà × Ò   jÑ1Ô1Ð1Ø Ðr;cóJ—t|¦« |¦«dSr=)rÚuninstrument_attribute)r*r+s r9Úunregister_attributerms$€Ý�VÑÔ×3Ò3°CÑ8Ô8Ð8Ð8Ð8r;cóP—t|¦«}|j}t|||¦«S)a4Initialize a collection attribute and return the collection adapter. This function is used to provide direct access to collection internals for a previously unloaded attribute. e.g.:: collection_adapter = init_collection(someobject, 'elements') for elem in values: collection_adapter.append_without_event(elem) For an easier way to do the above, see :func:`~sqlalchemy.orm.attributes.set_committed_value`. :param obj: a mapped object :param key: string attribute name where the collection is located. )r r{Úinit_state_collection)rêr+rrr›s r9rQrQqs*€õ$ ˜3Ñ Ô €EØ ŒJ€EÝ  ¨¨sÑ 3Ô 3Ð3r;có€—|j|j}| ||¦«}| |||¦«S)zDInitialize a collection attribute and return the collection adapter.)r7r,rûr„)rrr›r+rÜr‰s r9rrˆs>€ð Œ=˜Ô Ô "€DØ—’  uÑ-Ô-€IØ × Ò ˜u e¨YÑ 7Ô 7Ð7r;có�—t|¦«t|¦«}}|j|j |||¦«dS)a[Set the value of an attribute with no history events. Cancels any previous history present. The value should be a scalar value for scalar-holding attributes, or an iterable for any collection-holding attribute. This is the same underlying method used when a lazy loader fires off and loads additional data from the database. In particular, this method can be used by application code which has loaded additional attributes or collections through separate queries, which can then be attached to an instance as though it were part of its original loaded state. N)r r r7r,r)rFr+rZrrr›s r9rr�sE€õ" (Ñ+Ô+­]¸8Ñ-DÔ-Dˆ5€EØ „M�#ÔÔ×/Ò/°°u¸eÑDÔDÐDÐDÐDr;có’—t|¦«t|¦«}}|j|j ||||¦«dS)asSet the value of an attribute, firing history events. This function may be used regardless of instrumentation applied directly to the class, i.e. no descriptors are required. Custom attribute management schemes will need to make usage of this method to establish attribute state as understood by SQLAlchemy. :param instance: the object that will be modified :param key: string name of the attribute :param value: value to assign :param initiator: an instance of :class:`.Event` that would have been propagated from a previous event listener. This argument is used when the :func:`.set_attribute` function is being used within an existing event listening function where an :class:`.Event` object is being supplied; the object may be used to track the origin of the chain of events. .. versionadded:: 1.2.3 N)r r r7r,r“)rFr+rZrrrr›s r9Ú set_attributer£sG€õ2" (Ñ+Ô+­]¸8Ñ-DÔ-Dˆ5€EØ „M�#ÔÔ×Ò  u¨e°YÑ?Ô?Ð?Ð?Ð?r;cóŠ—t|¦«t|¦«}}|j|j ||¦«S)aZGet the value of an attribute, firing any callables required. This function may be used regardless of instrumentation applied directly to the class, i.e. no descriptors are required. Custom attribute management schemes will need to make usage of this method to make usage of attribute state as understood by SQLAlchemy. )r r r7r,r™©rFr+rrr›s r9Ú get_attributerÀs=€õ" (Ñ+Ô+­]¸8Ñ-DÔ-Dˆ5€EØ Œ=˜Ô Ô "× &Ò & u¨eÑ 4Ô 4Ð4r;cóŽ—t|¦«t|¦«}}|j|j ||¦«dS)aQDelete the value of an attribute, firing history events. This function may be used regardless of instrumentation applied directly to the class, i.e. no descriptors are required. Custom attribute management schemes will need to make usage of this method to establish attribute state as understood by SQLAlchemy. N)r r r7r,r–rs r9Ú del_attributerÎsC€õ" (Ñ+Ô+­]¸8Ñ-DÔ-Dˆ5€EØ „M�#ÔÔ×"Ò" 5¨%Ñ0Ô0Ð0Ð0Ð0r;cóâ—t|¦«t|¦«}}|j|j}|j ||j¦«| ||td¬¦«dS)aøMark an attribute on an instance as 'modified'. This sets the 'modified' flag on the instance and establishes an unconditional change event for the given attribute. The attribute must have a value present, else an :class:`.InvalidRequestError` is raised. To mark an object "dirty" without referring to any specific attribute so that it is considered within a flush, use the :func:`.attributes.flag_dirty` call. .. seealso:: :func:`.attributes.flag_dirty` T©Ú is_userlandN) r r r7r,r1ÚmodifiedrØr"r)rFr+rrr›r,s r9Ú flag_modifiedr#Üsj€õ"" (Ñ+Ô+­]¸8Ñ-DÔ-Dˆ5€EØ Œ=˜Ô Ô "€DØ„M×Ò˜5 $Ô"6Ñ7Ô7Ð7Ø ×Ò˜% ¥x¸TÐÑBÔBÐBÐBÐBr;có~—t|¦«t|¦«}}| |dtd¬¦«dS)a¹Mark an instance as 'dirty' without any specific attribute mentioned. This is a special operation that will allow the object to travel through the flush process for interception by events such as :meth:`.SessionEvents.before_flush`. Note that no SQL will be emitted in the flush process for an object that has no changes, even if marked dirty via this method. However, a :meth:`.SessionEvents.before_flush` handler will be able to see the object in the :attr:`.Session.dirty` collection and may establish changes on it, which will then be included in the SQL emitted. .. versionadded:: 1.2 .. seealso:: :func:`.attributes.flag_modified` NTr )r r r"r)rFrrr›s r9Ú flag_dirtyr%ós@€õ(" (Ñ+Ô+­]¸8Ñ-DÔ-Dˆ5€EØ ×Ò˜% ¥x¸TÐÑBÔBÐBÐBÐBr;rŠ)FNFNNr²r=)Or�rÏÚrrrërr8rrr r r r rrrrrrrrrrrrrrrrrrr r!r#r$r%Ú_self_inspectsÚ_MappedAttributeÚInspectionAttrÚPropComparatorr'r‘r·Úsymbolrr\rr]r×Úobjectr¾rÊrr=rJrÖrðÚ frozensetrçrñÚ namedtupler(r*rErþrrrrrrQrrrrrr#r%rIr;r9úr/sAðððð€€€àÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØ Ð Ð Ð Ð Ð ØÐÐÐÐÐØ(Ð(Ð(Ð(Ð(Ð(Ø"Ð"Ð"Ð"Ð"Ð"ØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØ#Ð#Ð#Ð#Ð#Ð#Ø(Ð(Ð(Ð(Ð(Ð(Ø"Ð"Ð"Ð"Ð"Ð"Ø*Ð*Ð*Ð*Ð*Ð*Ø'Ð'Ð'Ð'Ð'Ð'Ø#Ð#Ð#Ð#Ð#Ð#ØÐÐÐÐÐØ)Ð)Ð)Ð)Ð)Ð)Ø*Ð*Ð*Ð*Ð*Ð*Ø#Ð#Ð#Ð#Ð#Ð#ØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐð ÔðT(ðT(ðT(ðT(ðT(ØÔØÔØÔñT(ôT(ñÔðT(ðnBðBðBðBðBÐ.ñBôBðBð8}ð}ð}ð@ ˆDŒK˜Ñ !Ô !€ Ø ˆDŒK˜Ñ !Ô !€ Ø ˆTŒ[˜Ñ #Ô #€ Ø�$”+˜nÑ-Ô-€ØˆdŒk˜*Ñ%Ô%€ ð/*ð/*ð/*ð/*ð/*ˆFñ/*ô/*ð/*ðdDðDðDðDðD�FñDôDðDðN R&ðR&ðR&ðR&ðR&˜-ñR&ôR&ðR&ðjbðbðbðbðbÐ 3ñbôbðbðJM1ðM1ðM1ðM1ðM1˜mñM1ôM1ðM1ð` AðAðAðHˆdŒk˜,Ñ'Ô'€ Ø�IØ€RÐÑÔ˜B˜B˜x™LœL¨"¨"¨Y©-¬-Ð8ñôÐð ˆ$Œ/˜)Ð%FÐ%FÐ%FÑ GÔ G€ðgðgðgðgðgˆgñgôgðgðT�˜˜d DÑ)Ô)€ ð#.ð/@ð/@ð/@ð/@ðd+6ð+ð+ð+ð+ð6ð6ð6ð6ðððð ØØØØ ð)ð)ð)ð)ðZ:>ð ð ð ð ð9ð9ð9ð4ð4ð4ð.8ð8ð8ðEðEðEð&@ð@ð@ð@ð: 5ð 5ð 5ð 1ð 1ð 1ðCðCðCð.CðCðCðCðCr;