U aJ@sdZddlmZddlZddlZddlmZddlmZddlm Z ddlm Z dd lm Z dd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddl mZ ddlmZddlmZddlmZddlm Z ddlmZddlmZddl m!Z!ddl m"Z"ddlm#Z#ddZ$ddZ%d@d d!Z&d"d#Z'd$d%Z(d&d'Z)e*d(d)d*Z+d+d,Z,Gd-d.d.e-Z.Gd/d0d0e.Z/Gd1d2d2e.Z0e*d(d3d4Z1Gd5d6d6e0Z2d7d8Z3d9d:Z4d;d<Z5d=e5_6d>d?Z7dS)Az(Internal implementation for declarative.)absolute_importN) attributes)instrumentation) clsregistry)exc)mapper)InstrumentedAttribute)QueryableAttribute)_is_mapped_class)InspectionAttr)CompositeProperty)SynonymProperty)MapperProperty)Mapper)ColumnProperty) class_mapper)event)util) expression)Column)Table) topologicalcCs0t|rt|St|r(t|ddSdSdS)NF) configure)_DeferredMapperConfighas_clsconfig_for_clsr rclsr YC:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-nyjtotrf\sqlalchemy\orm\decl_base.py_declared_mapping_info%s    r"cCs\|tkr dS|jddrB|jD]}t|}|dk r |Sq dSt|}|rT|jS|SdS)N __abstract__F)object__dict__get __bases__"_resolve_for_abstract_or_classical_dive_for_cls_managerclass_)rsupZ clsmanagerr r r!r(0s  r(FcCs|dks tt|tsdS||jkr.t||S|jddD]@}t|}||jkr<||ksn|rj||jkr)rr[rrcrXr@Z mapper_clsr r r!r\s z_ImperativeMapperConfig.mapcCs|j}|dd}|dkrg}|jD]:}t|}|dkr:q$t|dk r$t|ddds$||q$|rt|dkrt d||f|d}nt |t r|j }||_ dS)NrdrOTrPr&Class %s has multiple mapped bases: %rr)rr&r'r(r"r3appendlenrrQrErr*rd)rXr@rrdinherits_searchcr r r!rks>      z*_ImperativeMapperConfig._setup_inheritance) rUr_r`rarYr EMPTY_DICTr\rk __classcell__r r rlr!r=s r=cseZdZdZfddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ dddZ ddZddZddZejfddZZS) rR) r;rcpersist_selectabledeclared_columns column_copies table_args tablename mapper_argsmapper_args_fnrdc stt||||rt|ni|_d|_t|_i|_| | t j Ht |j|j|j||||||||W5QRXdSr7)rfrRrYdictr;rvsetrwrx_setup_declared_events_scan_attributesrgrhrrirLrrj_extract_mappable_attributes_extract_declared_columns _setup_tablerkr^)rXr:rSr;r?r@rlr r!rYs$   z_ClassScanMapperConfig.__init__csLtjdr$ttdfdd}tjdrHttdfdd}dS) N__declare_last__after_configuredcsjdSr7)rrr rXr r!r?szG_ClassScanMapperConfig._setup_declared_events..after_configured__declare_first__before_configuredcsjdSr7)rrr rr r!rEszH_ClassScanMapperConfig._setup_declared_events..before_configured)r3rrZ listens_forr)rXrrr rr!r<s     z-_ClassScanMapperConfig._setup_declared_eventscsntdddkr"fdd}nHfddtDfddtDtfdd}|S) zProduce a function that checks if a class has overridden an attribute, taking SQLAlchemy-enabled dataclass fields into account. __sa_dataclass_metadata_key__Ncst||k Sr7)r.)keyrFrr r!attribute_is_overriddenTszR_ClassScanMapperConfig._cls_attr_override_checker..attribute_is_overriddencs$i|]}|jkr|j|jqSr metadatarJ.0fsa_dataclass_metadata_keyr r! Ys zE_ClassScanMapperConfig._cls_attr_override_checker..cs$i|]}|jkr|j|jqSr rrrr r!r^s cst|r|j}|}t|r(|j}||kr4dS|k r@dS|}t||}||krddS|k rzt|trzdS||krdS|k rdSdS)NFT)rGfgetr&r.rEr )rrFretZ all_field)absentall_datacls_fieldsrlocal_datacls_fieldsr r!rfs.    )r3rZdataclass_fieldslocal_dataclass_fieldsr$)rXrrr )rrrrrr!_cls_attr_override_checkerIs   (z1_ClassScanMapperConfig._cls_attr_override_checkercs<tdddkr"fdd}ntfdd}|S)zproduce a function to iterate the "attributes" of a class, adjusting for SQLAlchemy fields embedded in dataclass fields. rNc3s&tD]\}}||dfVq dS)NF)varsitems)rJrFrr r!local_attributes_for_classszM_ClassScanMapperConfig._cls_attr_resolver..local_attributes_for_classc3sjtD]0}|jkr |j|jt|jdfVq tD]\}}|krH||dfVqHdS)NTF)rrraddrJ_as_dc_declaredattrrr)fieldrJrFr field_namesrr r!rs  )r3r~)rXrrr rr!_cls_attr_resolvers z)_ClassScanMapperConfig._cls_attr_resolverc s |j|j}|j}d}d}}d}||j}jD]}|k o\t|dk o\t|ddd } ||} | s|k r|| || D]X\} } } | dkrt | | }|s| r|rfdd}q| dkrt | | }|s| r|rj }q| dkrFt | | }|s| r|rj }t |t ttdfs6td |k rd}q| rpt| rtd |j| |fqq|k rt | trqqt | trtd nt| r| jr| |krtd | f| | || <|| <}t| |nj| r$t| d}t |ts.| }n t| }t |trV|jrVt |j tsV|j!}||| <|| <t |ttfr|j"dkr| j#|_"n|$|| | q| r| |ks|| | k r|| | rt%t| r| } | || <qq4|r|sd}||_&||_'||_(dS) NrOTrP__mapper_args__cs tjSr7)r}rr rr r!r|sz?_ClassScanMapperConfig._scan_attributes..mapper_args_fn __tablename____table_args__z3__table_args__ value must be a tuple, dict, or NonezRegular (i.e. not __special__) attribute '%s.%s' uses @declared_attr, but owning class %s is mapped - not applying to subclass %s.zMapper properties (i.e. deferred,column_property(), relationship(), etc.) must be declared as @declared_attr callables on declarative mixin classes. For dataclass field() objects, use a lambda:zXAttribute '%s' on class %s cannot be processed due to @declared_attr.cascading; skipping))rr;rxrr/r"r3r_produce_column_copiesrKrrrEtupler}typer ArgumentErrorrGrrIrUrrrQrH__get__setattrr.r rZ_is_internal_proxyZoriginal_propertyZ descriptordoc__doc___warn_for_decl_attributesr,ryrzr|)rXr;rxr|ryZinherited_table_argsrzrr2Z class_mappedrrJrF is_dataclassZ check_declrr rr!rs                            z'_ClassScanMapperConfig._scan_attributescCs"t|tjrtd||fdS)NzAttribute '%s' on class %s appears to be a non-schema 'sqlalchemy.sql.column()' object; this won't be part of the declarative mapping)rErZ ColumnClauserrI)rXrrrsr r r!r`s  z0_ClassScanMapperConfig._warn_for_decl_attributesc Cs|j}|j}|j}|D]\}}}t|tr|||r:qq|jrLtdq||krd|krp|jpd||dj ks| ||<} |j | _ t ||| | ||<qdS)NzColumns with foreign keys to other columns must be declared as @declared_attr callables on declarative mixin classes. For dataclass field() objects, use a lambda:.re) rr;rxrErZ foreign_keysrrQrJrsZ_copy_creation_orderr) rXZattributes_for_classrrr;rxrJrFrZcopy_r r r!ris(   z-_ClassScanMapperConfig._produce_column_copiescCs@|j}|j}|j}t|ddd}t|D]}|dkr8q(||}t|rj|jr^td|jt ||}n4t |t r|j |k r|j |krt|j }t|||t |trt|dkrt |dttfrtd|q(nZt |ttfs|d s(|||||||s(t|||q(n|d kr2td |||<q(dS) NrOTrP)rerrzUse of @declared_attr.cascading only applies to Declarative 'mixin' and 'abstract' classes. Currently, this flag is ignored on mapped class %srrzIgnoring declarative-like tuple value of attribute '%s': possibly a copy-and-paste error with a comma accidentally placed at the end of the line?__rzdAttribute name 'metadata' is reserved for the MetaData instance when using a declarative base class.)rr;rMr3listrGrHrrIr.rEr r*rrrrrqrr startswithpoprrrQ)rXrr; our_stuffZ late_mappedkrZr r r!rsh        z3_ClassScanMapperConfig._extract_mappable_attributesc s |jtjfddd|j}tt}tD]\}}t |t t fr|j D]F}t |t rT|jdkrTt||t |t s||j|||qTq8t |t r8t||||j|||||jkr8|=q8|D]4\}}t|dkrtd|j|dt|fqdS)Ncs |jSr7rrrr r!zB_ClassScanMapperConfig._extract_declared_columns..rrzzOn class %r, Column object %r named directly multiple times, only one will be used: %s. Consider using orm.synonym insteadz, )rMrZsort_dictionaryrw collections defaultdictr~rrrErr columnsrr?_undefer_column_namerJrrrqrIrLjoinsorted)rXrwZname_to_prop_keyrrscolrJkeysr rr!rs8          z0_ClassScanMapperConfig._extract_declared_columnsNcCsn|j}|j}|j}|j}|j}t|}t|ddd}|_d|kr$|dkr$t|drjt |j }nt }|dk rddi} } |rt |tr|} n4t |trt |dtr|dd|d} } n|} |d } | r| | d <|d } | rd | d <|d||||ft|t| | }n@|dkr4|j}|rd|D]$} |j| s>td| jq>||_dS)NcSs|jSr7r)rsr r r!rrz5_ClassScanMapperConfig._setup_table..rre __table_cls__r rZ__autoload_with__ autoload_withZ __autoload__Tautoloadz8Can't add additional column %r when specifying __table__)rrzryr;rwrr5rr4runbound_method_to_callablerrrEr}rr&r[_metadata_for_clsrersZcontains_columnrrrrc)rXr?rrzryr;rwr6Z table_clsargsZtable_kwrrrsr r r!rsf          z#_ClassScanMapperConfig._setup_tablecCs t|jdr|jjS|jjSdS)Nr)r4rrr:)rXr6r r r!r2s z(_ClassScanMapperConfig._metadata_for_clsc Cs|j}|j}|j}|j}|dd}|dkrg}|jD]B}t|}|dkrLq6t|dk r6t|ddds6||kr6| |q6|rt |dkrt d||f|d}nt |tr|j}||_|dkr|jdkrt|dst d |n|jrt|j} | j} | j} |dkr|r t d |D]}|j| jkrh| j|j|krLq$t d ||| j|jf|jrzt d | || dk r$| | k r$| |q$dS) NrdrOTrPrrorZ __no_table__zwClass %r does not have a __table__ or __tablename__ specified and does not inherit from an existing table-mapped class.z?Can't place __table_args__ on an inherited class with no table.z;Column '%s' on class %s conflicts with existing column '%s'zDCan't place primary key columns on an inherited class with no table.)rcrryrwr&r'r(r"r3rprqrrQrErr*rdrvrrJrsZ primary_key append_columnZ_refresh_for_new_column) rXr@r?rryrwrdrrrsinherited_mapperinherited_tableZinherited_persist_selectabler r r!rk8s         z)_ClassScanMapperConfig._setup_inheritancec s|j}|jr|}ni}|r(||d|krFt|}||ddD]&}||krJ||}|j||||<qJd|kr|d}t|tr|j}||j k rt d|d|j r|j |d<|j r|ddst |j j }d|kr2tfdd |jDjpd |d<}|d d |jDt|D]N\}} t| tjsXq>|jkr>j|} t| tr>| g| j||<q>|} || d<| |_dS) NrM)Zversion_id_colZpolymorphic_onrdz:mapper inherits argument given for non-inheriting class %sZconcreteFexclude_propertiescsg|]}|jkr|jqSr )Z_columntopropertyrrrsrr r! s zD_ClassScanMapperConfig._prepare_mapper_arguments..r cSsg|] }|jqSr rrr r r!rs)rMr|updater}rxr&rErr*rdrrQr"rcr~rsunionrdifference_updaterwrrrZ ColumnElementZ_propsrrcopyr{) rXr@rMr{rvZ inherits_argrrrpZresult_mapper_argsr rr!_prepare_mapper_argumentssb             z0_ClassScanMapperConfig._prepare_mapper_argumentscCsF||t|jdr&t|jj}nt}|d||j|jf|j S)N__mapper_cls__r>) rr4rrrrrr[rcr{rnr r r!r\s  z_ClassScanMapperConfig.map)N)rUr_r`rarYrrrrrrrrrrrkrrrtr\rur r rlr!rR s  " G2 E) <RKrRcCs6tjj}||}t|r.t||js.||S|SdSr7)rrBrCcallablerErD)Zfield_metadatarZdecl_apirFr r r!rs  rcseZdZeZddZeddZej ddZe ddZ e dd Z e d d Z e d d Ze dddZejffdd ZZS)rcCsdSr7r r]r r r!r^sz$_DeferredMapperConfig._early_mappingcCs|Sr7)_clsrr r r!rsz_DeferredMapperConfig.clscCs t||j|_||j|j<dSr7)weakrefref_remove_config_clsr_configs)rXr*r r r!rscCs|j|ddSr7)rr)rrr r r!rsz(_DeferredMapperConfig._remove_config_clscCst|tot||jkSr7)rErrrrrr*r r r!rsz_DeferredMapperConfig.has_clscCs.t|dr|tj|dt|ddS)N_sa_raise_deferred_configzOClass %s has a deferred mapping on it. It is not yet usable as a mapped class.)msg)r4rorm_excZUnmappedClassErrorZ_safe_cls_namerr r r!raise_unmapped_for_cls s z,_DeferredMapperConfig.raise_unmapped_for_clscCs|jt|Sr7)rrrrr r r!rsz$_DeferredMapperConfig.config_for_clsTcsvfdddd|jDD}|s*|Stdd|Dg}D] |fddjDqDtt||S)Ncs&g|]\}}|dk rt|r|qSr7)r-)rmrS)base_clsr r!rs z:_DeferredMapperConfig.classes_for_base..cSsg|]}||jfqSr rrrr r r!rscss|]}|j|fVqdSr7rrr r r! #sz9_DeferredMapperConfig.classes_for_base..c3s&|]}|kr|fVqdSr7r )rr) all_m_by_clsm_clsr r!r's)rvaluesr}extendr'rrsort)rrrclasses_for_baseZtuplesr )rrrr!rs  z&_DeferredMapperConfig.classes_for_basecs |j|jdtt||Sr7)rrrrfrr\r]rlr r!r\.sz_DeferredMapperConfig.map)T)rUr_r`rrVrr^propertyrsetterrbrrrrrrtr\rur r rlr!rs"       rcCsd|jkrt|tr>t|||jj|dd|j||nt|tr|j D]2}t|trN|j dkrNt|||jj|ddqN|j||n`t|t r|j||nFt|t r|j |krt|j }|j||nt||||jnt|||dS)zadd an attribute to an existing declarative class. This runs through the logic to determine MapperProperty, adds it to the Mapper, adds a column to the mapped Table, etc. r>T)Zreplace_existingN)r%rErrrerr>Z add_propertyrrr?rr rrr __setattr___expire_memoizations)rrrZrr r r!_add_attribute3s&         rcCsjd|jkrZ||jkrZ|jjsZ|j|}t|ttttfrBtdqft |||j n t ||dS)Nr>zZ_dispose_calledrErrrr NotImplementedErrorr __delattr__r)rrrZr r r!_del_attributeTs"    rcKsBt|}|D]0}t||s,td||jft||||q dS)a=A simple constructor that allows initialization from kwargs. Sets attributes on the constructed instance using the names and values in ``kwargs``. Only keys that are present as attributes of the instance's class are allowed. These could be, for example, any mapped columns or relationships. z(%r is an invalid keyword argument for %sN)rr4 TypeErrorrUr)rXkwargsrSrr r r!_declarative_constructoris   rrYcCs$|jdkr||_|jdkr ||_dSr7)rrJ)rcolumnr r r!rs  r)F)8r __future__rrrZsqlalchemy.ormrrrrrrrgr r r2r r Zdescriptor_propsr rZ interfacesrrrMrrrrZsqlrZ sql.schemarrrr"r(r3r)r<rAZpreload_modulerGrKr$r8r=rRrrrrrrUrr r r r!sd                         %  1A] B!