a
    [gXE                    @  s  d Z ddlmZ ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ddlm
Z
 ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddlm!Z! ddlm"Z" ddlm#Z# ddl$m%Z% ddl$m&Z& dd l'm(Z( dd!l'm)Z) dd"l*m+Z+ dd#l*m,Z, dd$l*m-Z- dd%l*m.Z. dd&l*m/Z/ dd'l*m0Z0 dd(l1m2Z2 dd)l3m4Z4 dd*l3m5Z5 dd+l6m7Z7 dd,l6m8Z8 dd-l6m9Z9 dd.l6m:Z: d/d0lm;Z; d/dlmZ d/d1lm6Z6 d/d2l<m=Z= d/d3l>m?Z? d/d4l@mAZA d/d5l@mBZB d/d6l6mCZC d/d7lDmEZE d/d8lDmFZF d/d9lDmGZG d/d:lDmHZH d/d;lDmIZI d/d<lDmJZJ er6dd=lmKZK dd>lmLZL dd?l$mMZM dd@lNmOZO ddAlmPZP d/dBlQmRZR d/dCl@mSZS d/dDlTmUZU edEedFZVeeWef ZXeeedGf e
eWef f ZYG dHdI dIeIe  ZZG dJdK dKeZe  eIZ[G dLdM dMeJZ\dNdOdPdQdRZ]dNdSdPdTdUZ^dNdVdPdWdXZ_ddNdZdSd[d\d]d^Z`d_d`dPdadbZadcdNdddedfdgdhZbdcd_didjdkdldmdnZce6ddodpdSdqdrdsZedpdZd_dSdtdudvZfG dwdx dxZgG dydz dzegZhG d{d| d|eZiG d}d~ d~egZje6ddoddZdpdddZkG dd dejZldNdZdddddZmdNdZddddZndpdpddddZodeo_pdZdddddZqdS )z(Internal implementation for declarative.    )annotationsN)Any)Callable)cast)Dict)Iterable)List)Mapping)
NamedTuple)NoReturn)Optional)Sequence)Tuple)Type)TYPE_CHECKING)TypeVar)Union   )
attributes)clsregistry)exc)instrumentation)	mapperlib)_O)attr_is_internal_proxy)InstrumentedAttribute)QueryableAttribute)_is_mapped_class)InspectionAttr)CompositeProperty)SynonymProperty)_AttributeOptions)_DCAttributeOptions)_IntrospectsAnnotations)_MappedAttribute)_MapsColumns)MapperProperty)Mapper)ColumnProperty)MappedColumn)_extract_mapped_subtype)_is_mapped_annotation)class_mapper)de_stringify_annotation   )event)util)
expression)_NoArg)Column)Table)topological)_AnnotationScanType)get_args)
is_fwd_ref)
is_literal)Protocol)	TypedDict)
_ClassDict)_RegistryType)Mapped)declared_attr)ClassManager)NamedColumn)MetaData)
FromClause_T)bound.c                   @  s:   e Zd ZU dZded< ded< ded< dd	d
ddZdS )MappedClassProtocolzA protocol representing a SQLAlchemy mapped class.

    The protocol is generic on the type of class, use
    ``MappedClassProtocol[Any]`` to allow any mapped class.
    str__name__
Mapper[_O]
__mapper__rC   	__table__r   r   )kwreturnc                 K  s   d S N )selfrL   rO   rO   f/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/sqlalchemy/orm/decl_base.py__call__e       zMappedClassProtocol.__call__N)rH   
__module____qualname____doc____annotations__rR   rO   rO   rO   rQ   rF   Z   s
   
rF   c                   @  sV   e Zd ZU dZded< ded< ded< ded	< d
ed< ddddZddddZdS )_DeclMappedClassProtocolz:Internal more detailed version of ``MappedClassProtocol``.rB   metadatarG   __tablename___MapperKwArgs__mapper_args__Optional[_TableArgsType]__table_args__Optional[_DataclassArguments]_sa_apply_dc_transformsNonerM   c                 C  s   d S rN   rO   rP   rO   rO   rQ   __declare_first__q   rS   z*_DeclMappedClassProtocol.__declare_first__c                 C  s   d S rN   rO   rc   rO   rO   rQ   __declare_last__s   rS   z)_DeclMappedClassProtocol.__declare_last__N)rH   rT   rU   rV   rW   rd   re   rO   rO   rO   rQ   rX   h   s   
rX   c                   @  sN   e Zd ZU ded< ded< ded< ded< ded< ded< ded< d	ed
< dS )_DataclassArgumentszUnion[_NoArg, bool]initrepreqorderunsafe_hash
match_argskw_onlyz'Union[_NoArg, Callable[..., Type[Any]]]dataclass_callableNrH   rT   rU   rW   rO   rO   rO   rQ   rf   v   s   
rf   	Type[Any]z3Optional[Union[_DeferredMapperConfig, Mapper[Any]]]clsrM   c                 C  s0   t | rt | S t| r(t| ddS d S d S )NF)	configure)_DeferredMapperConfighas_clsconfig_for_clsr   r,   rr   rO   rO   rQ   _declared_mapping_info   s
    

rx   boolc                 C  s.   t | rt| ddd S t| r&dS dS dS )a  return True if this class will be used as a superclass to set in
    'inherits'.

    This includes deferred mapper configs that aren't mapped yet, however does
    not include classes with _sa_decl_prepare_nocascade (e.g.
    ``AbstractConcreteBase``); these concrete-only classes are not set up as
    "inherits" until after mappers are configured using
    mapper._set_concrete_base()

    _sa_decl_prepare_nocascadeTstrictFN)rt   ru   _get_immediate_cls_attrr   rw   rO   rO   rQ   _is_supercls_for_inherits   s    
r~   Optional[Type[Any]]c                 C  s\   | t u rd S | jddrB| jD ]}t|}|d ur |  S q d S t| }|rT|jS | S d S )N__abstract__F)object__dict__get	__bases__"_resolve_for_abstract_or_classical_dive_for_cls_managerclass_)rr   base_supZ
clsmanagerrO   rO   rQ   r      s    

r   FrG   zOptional[Any])rr   attrnamer|   rM   c                 C  s   |dksJ t | tsdS || jv r.t| |S | jdd D ]D}t|du}||jv r<|| u sr|rn|| jv r<n |s<t||  S q<dS )a  return an attribute of the class that is either present directly
    on the class, e.g. not on a superclass, or is from a superclass but
    this superclass is a non-mapped mixin, that is, not a descendant of
    the declarative base and is also not classically mapped.

    This is used to detect attributes that indicate something about
    a mapped class independently from any mapped classes that it may
    inherit from.

    r   Nr   T)
issubclassr   r   getattr__mro__r   r   )rr   r   r|   baseZ_is_classical_inheritsrO   rO   rQ   r}      s(    



  r}   Type[_O]zOptional[ClassManager[_O]]c                 C  s&   | j D ]}t|}|r|  S qd S rN   )r   r   opt_manager_of_class)rr   r   managerrO   rO   rQ   r      s    

r   r=   r<   Optional[_MapperConfig])registryrr   dict_rM   c                 C  s   t | ||d i S rN   )_MapperConfigsetup_mapping)r   rr   r   rO   rO   rQ   _as_declarative   s    r   Optional[FromClause]r[   rI   )r   rr   table	mapper_kwrM   c                 C  s   t | ||| td|jS )NzMappedClassProtocol[_O])_ImperativeMapperConfigr   rJ   )r   rr   r   r   rO   rO   rQ   _mapper   s    r   zsqlalchemy.orm.decl_apir   )objrM   c                 C  s   t jjj}t| |t jfS rN   )r0   	preloadedorm_decl_api_declared_attr_common
isinstanceZclassproperty)r   r   rO   rO   rQ   _is_declarative_props  s    
r   )r   namerr   rM   c                 C  s2   t | r*t| ddr&td||f  dS dS d S )N
_cascadingFz~@declared_attr.cascading is not supported on the %s attribute on class %s.  This attribute invokes for subclasses in any case.T)r   r   r0   warn)r   r   rr   rO   rO   rQ   _check_declared_props_nocascade  s    r   c                   @  s   e Zd ZU dZded< ded< ded< ded	< ed
ddddddddZd
dddddZddddddZd#dddddZ	dddd d!Z
d"S )$r   )rr   	classname
propertiesdeclared_attr_reg__weakref__rp   rr   rG   r   z_util.OrderedDict[str, Union[Sequence[NamedColumn[Any]], NamedColumn[Any], MapperProperty[Any]]]r   zDict[declared_attr[Any], Any]r   r=   r   r<   r   r[   r   )r   cls_r   r   r   rM   c                 C  s|   t | }|r*|j|u r*td| d|jddr<d S t|dddpRt|d}|rht	|||||S t
|||||S d S )	NClass z, already has been instrumented declarativelyr   Frz   Tr{   Z_sa_decl_prepare)r   r   r   r   InvalidRequestErrorr   r   r}   hasattrrt   _ClassScanMapperConfig)rr   r   r   r   r   r   r   Z	defer_maprO   rO   rQ   r   *  s&    	



z_MapperConfig.setup_mapping)r   r   r   c                 C  sx   t |td| _|j| _t  | _i | _|	ddsNt
j| jd|| |jd n&t| j}|rd|jsttd| j d S )Nr   non_primaryF)finalizer   declarative_scanZinit_methodztClass %s has no primary mapper configured.  Configure a primary mapper first before setting up a non primary Mapper.)r0   Zassert_arg_typetyperr   rH   r   OrderedDictr   r   r   r   Zregister_classconstructorr   r   	is_mappedr   r   )rP   r   r   r   r   rO   rO   rQ   __init__I  s&    

z_MapperConfig.__init__rD   )r   valuerM   c                 C  s   t | j}||| |S rN   )r   manager_of_classrr   Zinstall_member)rP   r   r   r   rO   rO   rQ   set_cls_attributee  s    z_MapperConfig.set_cls_attribute.Mapper[Any]r   rM   c                 C  s
   t  d S rN   )NotImplementedErrorrP   r   rO   rO   rQ   mapj  s    z_MapperConfig.mapra   c                 C  s   |  | d S rN   )r   r   rO   rO   rQ   _early_mappingm  s    z_MapperConfig._early_mappingN).)rH   rT   rU   	__slots__rW   classmethodr   r   r   r   r   rO   rO   rO   rQ   r     s   
r   c                      sR   e Zd ZdZddddd fddZejfdd	d
ddZddd
ddZ  Z	S )r   )local_tableinheritsr=   r   r   r[   )r   r   r   r   c                   s|   t  ||| | d|| _tjD |ddsFt| j	| j
|j | | | | W d    n1 sn0    Y  d S )NrK   r   F)superr   r   r   r   _CONFIGURE_MUTEXr   r   	add_classr   rr   _class_registry_setup_inheritancer   )rP   r   r   r   r   	__class__rO   rQ   r   t  s    
z _ImperativeMapperConfig.__init__r   r   c                 C  s"   t }| d|| j| jfi |S )NrJ   )r'   r   rr   r   rP   r   Z
mapper_clsrO   rO   rQ   r     s
    z_ImperativeMapperConfig.mapra   c                 C  s   | j }|dd }|d u rg }|jD ]0}t|}|d u r:q$t|r$||vr$|| q$|rt|dkrxtd||f |d }nt	|t
r|j}|| _d S )Nr   r   &Class %s has multiple mapped bases: %rr   )rr   r   r   r   r~   appendlenr   r   r   r'   r   r   )rP   r   rr   r   inherits_searchr   crO   rO   rQ   r     s*    


z*_ImperativeMapperConfig._setup_inheritance)
rH   rT   rU   r   r   r0   
EMPTY_DICTr   r   __classcell__rO   rO   r   rQ   r   q  s   r   c                   @  sF   e Zd ZU ded< ded< ded< ded< d	ed
< ded< ded< dS )_CollectedAnnotationr6   raw_annotationzOptional[Type[Mapped[Any]]]mapped_containerzUnion[_AnnotationScanType, str]extracted_mapped_annotationry   is_dataclassr   
attr_valuerG   originating_modulerp   originating_classNro   rO   rO   rO   rQ   r     s   
r   c                      s.  e Zd ZU dZdZded< ded< ded< d	ed
< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded< ded < ded!< d"ed#< ded$< dd%ddd&d' fd(d)Zd*d+d,d-Zd%d.d/d0d1Zh d2Z	e
d3Zd4d5d/d6d7Zd*d+d8d9Zd*d+d:d;Zed%d<d=d>d?Zed@d%d<d*dAdBdCZed@d*dDdEdFZdGdHd4dIdJdKdLdMdNZd4dGdJd*dOdPdQZd5d.dd4dRdSdTdUZd*d+dVdWZd*d+dXdYZdmdd*d[d\d]Zd^d_d`dadbZd&d*dcdddeZd&d*dcdfdgZd&d*dcdhdiZejfd&djdcdkdlZ   Z!S )nr   )r   clsdict_viewcollected_attributescollected_annotationsr   persist_selectabledeclared_columnscolumn_orderingcolumn_copies
table_args	tablenamemapper_argsmapper_args_fntable_fnr   singleallow_dataclass_fieldsdataclass_setup_argumentsis_dataclass_prior_to_mappingallow_unmapped_annotationsFr=   r   r<   r   zDict[str, _CollectedAnnotation]r   Dict[str, Any]r   r   r   r   zutil.OrderedSet[Column[Any]]r   zDict[Column[Any], int]r   zRDict[Union[MappedColumn[Any], Column[Any]], Union[MappedColumn[Any], Column[Any]]]r   zOptional[str]r   Mapping[str, Any]r   r]   r   z&Optional[Callable[[], Dict[str, Any]]]r   r   r   ry   r   r   r   r_   r   r   r   r[   )r   r   r   r   r   c           	        sV  |rt |nt j| _t ||| || _d | _i | _i | _	t 
 | _i | _i | _d| _t| jdd  | _}t| jddpt| j| _t| | _}t|d}|r|r|rtdt|o|| _|   |   |   tj\ t !| j"| j|j# | $| | %  | &  | '| | (| | )| W d    n1 sH0    Y  d S )NFr`   Z__allow_unmapped____sa_dataclass_metadata_key__zSQLAlchemy mapped dataclasses can't consume mapping information from dataclass.Field() objects if the immediate class is not already a dataclass.)*r0   Zimmutabledictr   r   r   r   r   r   r   r   Z
OrderedSetr   r   r   r   r   rr   r   ry   r   dataclassesr   r   r}   r   r   r   _setup_declared_events_scan_attributes_setup_dataclasses_transformsr   r   r   r   r   r   _setup_inheriting_mapper_extract_mappable_attributes_extract_declared_columns_setup_table_setup_inheriting_columnsr   )	rP   r   r   r   r   r   ZdcaZcldZsdkr   rO   rQ   r     sR    



	


z_ClassScanMapperConfig.__init__ra   rb   c                   sX   t  jdr*ttddd fdd}t  jdrTttddd fd	d
}d S )Nre   after_configuredra   rb   c                     s   t d j  d S N_DeclMappedClassProtocol[Any])r   rr   re   rO   rc   rO   rQ   r   I  s    zG_ClassScanMapperConfig._setup_declared_events.<locals>.after_configuredrd   before_configuredc                     s   t d j  d S r   )r   rr   rd   rO   rc   rO   rQ   r   Q  s    zH_ClassScanMapperConfig._setup_declared_events.<locals>.before_configured)r}   rr   r/   Zlistens_forr'   )rP   r   r   rO   rc   rQ   r   F  s    

z-_ClassScanMapperConfig._setup_declared_eventszCallable[[str, Any], bool]rq   c                   s   | j rtdnds2ddddfdd}nRfd	d
tD fdd
tD t  dddd fdd}|S )zProduce a function that checks if a class has overridden an
        attribute, taking SQLAlchemy-enabled dataclass fields into account.

        r   NrG   r   ry   )keyr   rM   c                   s   t  | ||uS rN   )r   )r   r   rw   rO   rQ   attribute_is_overriddenh  s    zR_ClassScanMapperConfig._cls_attr_override_checker.<locals>.attribute_is_overriddenc                   s$   i | ]} |j v r|j|j   qS rO   rY   r   .0fsa_dataclass_metadata_keyrO   rQ   
<dictcomp>l  s   
zE_ClassScanMapperConfig._cls_attr_override_checker.<locals>.<dictcomp>c                   s$   i | ]} |j v r|j|j   qS rO   r   r   r  rO   rQ   r  q  s   
c                   s   t |r|j}|  }t |r(|j}||u r4dS | ur@dS |  }t| |}||u rddS | urzt|trzdS ||u rdS | urdS dS )NFT)r   fgetr   r   r   r   )r   r   retZ	all_field)absentall_datacls_fieldsrr   local_datacls_fieldsrO   rQ   r   y  s,    
)r   r}   r0   dataclass_fieldslocal_dataclass_fieldsr   )rP   rr   r   rO   )r  r	  rr   r
  r  rQ   _cls_attr_override_checkerW  s     

(z1_ClassScanMapperConfig._cls_attr_override_checker>   r^   rZ   rK   r\   z^(?:_sa_|__)rp   z2Callable[[], Iterable[Tuple[str, Any, Any, bool]]]c                   s   t |t|| j | j fddt ttD | jrTt|dndstddfdd}n4d	d
 t 	|D ddfdd}|S )zproduce a function to iterate the "attributes" of a class
        which we want to consider for mapping, adjusting for SQLAlchemy fields
        embedded in dataclass fields.

        c                   s"   g | ]} |r| v r|qS rO   )match)r  n)_include_dunders_match_exclude_dundersrO   rQ   
<listcomp>  s   z=_ClassScanMapperConfig._cls_attr_resolver.<locals>.<listcomp>r   Nz$Iterable[Tuple[str, Any, Any, bool]]rb   c                     s    fddD S )Nc                 3  s&   | ]}| |  |d fV  qdS )FNr   )r  r   )cls_annotationscls_varsrO   rQ   	<genexpr>  s   z`_ClassScanMapperConfig._cls_attr_resolver.<locals>.local_attributes_for_class.<locals>.<genexpr>rO   rO   )r  r  namesrO   rQ   local_attributes_for_class  s    zM_ClassScanMapperConfig._cls_attr_resolver.<locals>.local_attributes_for_classc                 S  s   i | ]}|j |qS rO   )r   )r  fieldrO   rO   rQ   r    s   z=_ClassScanMapperConfig._cls_attr_resolver.<locals>.<dictcomp>c                  3  sd   D ]Z}  | d }|rD|jv rD|jt|j  |jdfV  q|  |   | dfV  qd S )NTF)r   rY   r   _as_dc_declaredattr)r   r  )r  r  r  fixed_sa_dataclass_metadata_keyr  r  rO   rQ   r    s    )
r0   get_annotationsvarsr  r  Zmerge_lists_w_orderinglistr   r}   r  )rP   rr   r  rO   )r  r  r  r  r  r  r  r  rQ   _cls_attr_resolver  s,    
z)_ClassScanMapperConfig._cls_attr_resolverc              	     s  | j }td| | j}| j}| j}| j}d }d  }}d }	d }
d|v }| | j }g }|jD ]R}||uolt|}| 	|}|s||ur| 
||||}ni }|||||f qZ|D ]\}}}}|| | D ]\}}}}||v r|dkr(t|||}|s|r|rdd fdd}|}n|dkrXt|||}|
s|rP|r j}
n|dkrt|||}|r|	sd	d fd
d}|}	nh|dkrt|||}|s|r|r j}t|tttd fstd||urd}n
dsJ q|r,t|r|jstd|j|||f  qq||urt|ttfrLqАqt|trftdqt|rt|d us~J |jr||v rtd||f  | || ||<  ||< }t!||| nl|rt"||d }t|t#s|$ }n
t"||}t|t#r(t%|r(t|j&ts(|j'}| ||< ||< t|ttfr\|j(d u r\|j)|_(| *||+ |d| n:t,|||r|s||v s||d sJ qn| -||| q|r||vs|| |ur|||rJ t|r|$ }|||< | *|||d| q| *|||d |}|d uo0|j.d u}|d urB|j/n|}|d u rv|sv|rv|d urj|nt ||< q||v r|||< qq|r|
sd }|| _0|
| _1|| _2|	| _3d S )Nr   rK   r\   r   rb   c                     s
   t  jS rN   )dictr\   rO   cls_as_DeclrO   rQ   _mapper_args_fnA  s    z@_ClassScanMapperConfig._scan_attributes.<locals>._mapper_args_fnrZ   rC   c                     s    j S rN   )rK   rO   r!  rO   rQ   	_table_fnW  s    z:_ClassScanMapperConfig._scan_attributes.<locals>._table_fnr^   z3__table_args__ value must be a tuple, dict, or NoneTFzRegular (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)4rr   r   r   r   r   r  r  r   r~   r  _produce_column_copiesr   updater   rZ   r^   r   tupler   r   r   ArgumentErrorr   Z_quietr0   r   rH   r3   r)   r&   r   r   __get__setattrr   r   r  r   Zoriginal_propertyZ
descriptordocrV   _collect_annotationZ_collect_return_annotationr+   _warn_for_decl_attributesr   r   r   r   r   r   )rP   rr   r   r   r   r  r   r   Zinherited_table_argsr   r   fixed_tabler   basesr   Zclass_mappedr  Zlocally_collected_columnsr   r   
annotationis_dataclass_fieldZ
check_declr#  r$  r  collected_annotationr   Zgenerated_objrO   r!  rQ   r     sn   





	















z'_ClassScanMapperConfig._scan_attributesc              	     s  j }|sd S djjv r.tdj ddjjv rNtdj dttdddd	fd
d t	j}|d usJ fdd fddj
 D D }r D ]>\}}tjdj dddd |D  d| dddd qi }i }|D ]R}t|dkr$|\}	}
n,t|dkrF|\}	}
}|||	< n
dsPJ |
||	< q| D ]\}}tj|| qd|j| d S )N__dataclass_fields__r   z is already a dataclass; ensure that base classes / decorator styles of establishing dataclasses are not being mixed. This can happen if a class that inherits from 'MappedAsDataclass', even indirectly, is been mapped with '@registry.mapped_as_dataclass'rK   zk already defines a '__table__'. ORM Annotated Dataclasses do not support a pre-existing '__table__' elementrG   rp   ry   )r   r   rM   c                   s&   | j ur"d|jvr"| |  dS )Nr3  T)rr   r   r   )r   r   )rP   warn_for_non_dc_attrsrO   rQ   _allow_dataclass_field:  s    zT_ClassScanMapperConfig._setup_dataclasses_transforms.<locals>._allow_dataclass_fieldc                   s.   g | ]&\}}}t ||| j|tjqS rO   )r!   Z!_get_arguments_for_make_dataclassr   r   r2   NO_ARG)r  r   annor   rc   rO   rQ   r  H  s   zH_ClassScanMapperConfig._setup_dataclasses_transforms.<locals>.<listcomp>c           	      3  sV   | ]N\}\}}}}}}} ||r|j vs<tj | ts||rF|n||fV  qd S rN   )r   r   r   )	r  r   Zraw_annor   Zmapped_annoZis_dcr   r   r   )r5  rP   rO   rQ   r  O  s"   



zG_ClassScanMapperConfig._setup_dataclasses_transforms.<locals>.<genexpr>zWhen transforming z to a dataclass, attribute(s) , c                 s  s   | ]}t |V  qd S rN   rh   )r  r   rO   rO   rQ   r  w  rS   z originates from superclass a  , which is not a dataclass.  This usage is deprecated and will raise an error in SQLAlchemy 2.1.  When declaring SQLAlchemy Declarative Dataclasses, ensure that all mixin classes and other superclasses which include attributes are also a subclass of MappedAsDataclass.z2.0Zdcmxcoder.      F)r   rr   r   r   r   collectionsdefaultdictr  r   r   r   itemsr0   Zwarn_deprecatedjoinr   r*  _apply_dataclasses_to_any_class)rP   r   r   
field_listr   Znon_dc_attrsr   defaultsitemr   tpspeckvrO   )r5  rP   r4  rQ   r     sb    

'





z4_ClassScanMapperConfig._setup_dataclasses_transformsz!Mapping[str, _AnnotationScanType])klassrM   c           	      C  sl   t |}i }| D ]P\}}t|||r^t|||j|td dddd}|rf|\}}|||< q|||< q|S )NFrequiredr1  expect_mapped)r0   r  r?  r+   r*   rT   r   )	rr   rI  r  Znew_annor   r0  	extractedinner_rO   rO   rQ   (_update_annotations_for_non_mapped_class  s&    



z?_ClassScanMapperConfig._update_annotations_for_non_mapped_classrf   )r   rI  use_annotationsrM   c              
   C  s   |  | |d }|tju r"tj}|r@t|dd }td||_nd }zz"||fi dd | D  W nH t	t
fy } z,tjd|jd|dd	d
|W Y d }~n
d }~0 0 W |r|d u r|`q||_n|r|d u r|`n||_0 d S )Nrn   rW   r   c                 S  s(   i | ] \}}|t jur|d kr||qS )rn   )r2   r6  )r  rG  rH  rO   rO   rQ   r    s   zJ_ClassScanMapperConfig._apply_dataclasses_to_any_class.<locals>.<dictcomp>zAPython dataclasses error encountered when creating dataclass for z: zN. Please refer to Python dataclasses documentation for additional information.Zdcter:  )_assert_dc_argumentsr2   r6  r   	dataclassr   r   rW   r?  	TypeError
ValueErrorr   r   rH   )rr   r   rI  rQ  rn   ZrestoredexrO   rO   rQ   rA    sF    


z6_ClassScanMapperConfig._apply_dataclasses_to_any_class)	argumentsrM   c                 C  sH   h d}t ||}|rDddd t|D }td| dd S )N>   rg   rl   rh   rk   ri   rn   rj   rm   r8  c                 s  s   | ]}|V  qd S rN   rO   )r  argrO   rO   rQ   r    rS   z>_ClassScanMapperConfig._assert_dc_arguments.<locals>.<genexpr>zDataclass argument(s) z are not accepted)set
differencer@  sortedr   r(  )rr   rW  allowedZdisallowed_argsmsgrO   rO   rQ   rR    s    

z+_ClassScanMapperConfig._assert_dc_argumentsrG   r6   zOptional[bool]r   zOptional[_CollectedAnnotation])r   r   r   rL  r   rM   c              
   C  s  || j v r| j | S |d u r d S | j}| j}|d u r`t|tj}| o\| o\|d u p\t|t}nd}d}t|| j|j	|t
|d||o| d}	|	d u rd S |	\}
}|d u rt|
st|
D ]8}t|dddrt| j||j	dd}t|tr| }qt|||
|||j	| | j |< }|S )NFrJ  T)Zcheck_genericZcheck_for_plain_string)Zinclude_generic)r   r   r   r   r   Fieldr$   r*   rr   rT   r   r9   r7   r8   r-   r#   Zfound_in_pep593_annotatedr   )rP   r   r   r   rL  r   r   Zallow_unmappedr1  rM  r   r   elemcarO   rO   rQ   r,    sh    

	


	z*_ClassScanMapperConfig._collect_annotation)rr   r   r   rM   c                 C  s(   t |tjr$td| d| d d S )NAttribute '' on class z appears to be a non-schema SQLAlchemy expression object; this won't be part of the declarative mapping. To map arbitrary expressions, use ``column_property()`` or a similar function such as ``deferred()``, ``query_expression()`` etc. )r   r1   ColumnElementr0   r   )rP   rr   r   r   rO   rO   rQ   r-  B  s    z0_ClassScanMapperConfig._warn_for_decl_attributesz0Dict[str, Union[Column[Any], MappedColumn[Any]]])attributes_for_classr   r.  r   rM   c                 C  sd  | j }| j}i }| j}| D ]@\}	}
}}|s|
d u rt|||r||	|
rNq| |	||d|
}|d urn|jn|
}
|
d u rt }
|
||	< t||	|
 qt|
t	tfr||	|
rq| |	||d|
}|d ur|jn|
}
|	|vrd|v r t
|
dd p|	|d jv s|
jr:|
jD ]*}|jd ur|jjd u rtdq|
  ||
< }|||	< t||	| q|S )NTrK   r   zColumns with foreign keys to non-table-bound columns must be declared as @declared_attr callables on declarative mixin classes.  For dataclass field() objects, use a lambda:.)rr   r   r   r+   r,  r   r)   r*  r   r3   r   r   Zforeign_keys_table_columnr   r   r   Z_copy)rP   rd  r   r.  r   rr   r   Zlocally_collected_attributesr   r   r   r0  r   r2  ZfkZcopy_rO   rO   rQ   r%  O  sl    	







z-_ClassScanMapperConfig._produce_column_copiesc                   s  | j }| j}| j}| j}t|ddd}| j}|p4| j}t| j}t	|D ]}	|	|v rXqH||	  t
 r jr~td| j   t||	 n4t tr j|ur j|	krt j t||	  t trt dkrt d ttfrtd|	  qHn|rt tjrqHnt ttfsR||	 | ||	  |sHt||	  qHn|	dv rrtd	|	 d
nrt trt |	| j!"   nNt t#r@| j$"|	d\}
}}}}}}|d us|
d u s|r6z  %| | j&|||	||
||	 W n: t'y2 } z t(d|
 d|W Y d }~n
d }~0 0 n
|s@J t tr j)r|st t*rpg d}ng d} fdd|D }t(d|	 d| dd+t,dd |D  dt t*t-fs||	 t||	  qH ||	< qHd S )Nrz   Tr{   zUse of @declared_attr.cascading only applies to Declarative 'mixin' and 'abstract' classes.  Currently, this flag is ignored on mapped class %sr   r   zIgnoring declarative-like tuple value of attribute '%s': possibly a copy-and-paste error with a comma accidentally placed at the end of the line?)rY   zAttribute name 'z-' is reserved when using the Declarative API.)NNNFNNNz7Could not resolve all types within mapped annotation: "zU".  Ensure all types are written correctly and are imported within the module in use.)rg   default_factoryrh   default)rg   rf  rh   c                   s(   h | ] }t  jd | tjur|qS )Zdataclasses_)r   Z_attribute_optionsr2   r6  r  ar   rO   rQ   	<setcomp>H  s   zF_ClassScanMapperConfig._extract_mappable_attributes.<locals>.<setcomp>ra  rb  z# includes dataclasses argument(s): r8  c                 s  s   | ]}t |V  qd S rN   r9  rh  rO   rO   rQ   r  T  rS   zF_ClassScanMapperConfig._extract_mappable_attributes.<locals>.<genexpr>zF but class does not specify SQLAlchemy native dataclass configuration.).rr   r   r   r  r}   r   r   ry   r   r  r   r   r0   r   r   r   r   r   r   r    r*  r'  r   r3   r$   r   r^  r"   popr-  r   r   _undefer_column_namer   r   r#   r   r   r   	NameErrorr(  Z_has_dataclass_argumentsr&   r@  r[  r%   )rP   rr   r   	our_stuffr  Zlate_mappedr   Zexpect_annotations_wo_mappedZlook_for_dataclass_thingsrG  r0  r   r   r   r   r   r   neargnamesargsrO   rj  rQ   r     s    





		


	

z3_ClassScanMapperConfig._extract_mappable_attributesc              
   C  s2  | j }| j}| j}tt}t| D ]\}}t|t	r|j
}|rN|||< n||= |jD ]N\}}	t|ts|||j | || |	||< |d u rZ||jkrZ|||< qZq(t|tr(|jd usJ ||j | || ||jkr(||= q(| D ]4\}
}t|dkrtd| j|
dt|f  qd S )Nr   zzOn class %r, Column object %r named directly multiple times, only one will be used: %s. Consider using orm.synonym insteadr8  )r   r   r   r=  r>  rY  r  r?  r   r%   mapper_property_to_assigncolumns_to_assignr   r   addr   r3   r   r0   r   r   r@  r[  )rP   ro  r   r   Zname_to_prop_keyr   r   Zmp_to_assigncolZ
sort_orderr   keysrO   rO   rQ   r   n  s<    







z0_ClassScanMapperConfig._extract_declared_columnsN)r   rM   c                   s  | j }td|}| j}| j}| j}| j}| j t|}| j	d u rFd|vrF|d u rFt
|drzttt t|j}	nt}	|d urd}
i }|rt|tr|}n4t|trt|d tr|dd |d  }
}n|}
|d}|r||d< |d	}|rd
|d< t| fddd}| d|	|| |g||
R i |}nZ|d u rp| j	rj| d| 	 }n|j}|r|D ]$}|j|sztd|j qz|| _d S )NMappedClassProtocol[Any]rK   __table_cls__rO   r   Z__autoload_with__autoload_withZ__autoload__Tautoloadc                   s     | dS )Nr   r  )r   r   rO   rQ   <lambda>  rS   z5_ClassScanMapperConfig._setup_table.<locals>.<lambda>r   z8Can't add additional column %r when specifying __table__)rr   r   r   r   r   r   r   r   r   r   r   r   r4   r0   unbound_method_to_callablery  r   r   r'  r   r[  r   _metadata_for_clsrK   r   Zcontains_columnr   r(  r   r   )rP   r   rr   r"  r   r   r   r   r   Z	table_clsrr  Ztable_kwr{  r|  Zsorted_columnsr   rO   r}  rQ   r     s    










z#_ClassScanMapperConfig._setup_tablezClassManager[Any]rB   )r   rM   c                 C  s&   t | jdd }|d ur|S |jjS d S )NrY   )r   rr   r   rY   )rP   r   metarO   rO   rQ   r    s    z(_ClassScanMapperConfig._metadata_for_clsr   c                 C  s   | j }|dd }|d u rg }|jD ]0}t|}|d u r:q$t|r$||vr$|| q$|rt|dkrxtd||f |d }nt	|t
r|j}|| _| j}d|vr| jd u rd| _d S )Nr   r   r   r   rK   T)rr   r   r   r   r~   r   r   r   r   r   r'   r   r   r   r   r   )rP   r   rr   r   r   r   r   r   rO   rO   rQ   r     s0    


z/_ClassScanMapperConfig._setup_inheriting_mapperc           
   
   C  s`  | j }| j}| j}| j}|d u rF| jd u rFt|dsFtd| n| jr\t| j}|d usdJ |j }|j	}|d u r\|rt
d|rt|tst
d| j d| j d|D ]}	|d usJ |	j|jv r|j|	j |	u rqt
d|	 d|j d	|j|	j  d
|	jr t
dtr6t|ts6J ||	 |d ur||ur||	 qd S )NZ__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.z9Can't declare columns on single-table-inherited subclass z; superclass z is not mapped to a TablezColumn 'rb  z! conflicts with existing column 'zs'.  If using Declarative, consider using the use_existing_column parameter of mapped_column() to resolve conflicts.zDCan't place primary key columns on an inherited class with no table.)r   rr   r   r   r   r}   r   r   rx   r   r(  r   r4   r   r   rH   primary_keyr   append_columnZ_refresh_for_new_column)
rP   r   r   rr   r   r   Zinherited_mapper_or_configinherited_tableZinherited_persist_selectablerv  rO   rO   rQ   r     st    



z0_ClassScanMapperConfig._setup_inheriting_columnsc                   s  j }jr }ni }|r(|| d|v rFt|}||d  dD ]&}||v rJ|| }j||||< qJd|v rfddt|d D |d< d|v r|d }t|t	r|j
}|jurtd|d  jrj|d< jr|dd	stjd	  j}d
|vrX fdd|jD  jp6d |d
< }|dd jD  t| D ]N\}}	t|	tjs~qd| jv rd j| }
t|
trd|	g|
j ||< qd| }||d< |_d S )Nr   )Zversion_id_colZpolymorphic_onr  c                   s   g | ]} j ||qS rO   )r   r   )r  rH  rc   rO   rQ   r  ~  s   zD_ClassScanMapperConfig._prepare_mapper_arguments.<locals>.<listcomp>r   z:mapper inherits argument given for non-inheriting class %sZconcreteFexclude_propertiesc                   s   h | ]}| j vr|jqS rO   )Z_columntopropertyr   r  r   )inherited_mapperrO   rQ   rk    s   
zC_ClassScanMapperConfig._prepare_mapper_arguments.<locals>.<setcomp>rO   c                 S  s   g | ]
}|j qS rO   r  r  rO   rO   rQ   r    rS   )r   r   r&  r   r   r   r0   Zto_listr   r'   r   r   r   r   r,   r   r   unionr  difference_updater   r  r?  r1   rc  Z_propsr(   columnscopyr   )rP   r   r   r   rG  rH  Zinherits_argr  r  rv  pZresult_mapper_argsrO   )r  rP   rQ   _prepare_mapper_argumentsg  sf    











z0_ClassScanMapperConfig._prepare_mapper_argumentsr   c                 C  sP   |  | t| jdr,tdt| jj}nt}| d|| j| j	fi | j
S )N__mapper_cls__zType[Mapper[Any]]rJ   )r  r   rr   r   r0   r  r  r'   r   r   r   r   rO   rO   rQ   r     s    
z_ClassScanMapperConfig.map)N)"rH   rT   rU   r   is_deferredrW   r   r   r  r  recompiler  r  r   r   r   rP  rA  rR  r,  r-  r%  r   r   r   r  r   r   r  r0   r   r   r   rO   rO   r   rQ   r     sb   

ML
D  0x4JZ F;N!HQr   r   )field_metadatar  rM   c                 C  s6   t jj}| | }t|r.t||js.||S |S d S rN   )r0   r   r   callabler   r?   )r  r  decl_apir   rO   rO   rQ   r    s
    
r  c                      s   e Zd ZU ded< dZe Zded< dddd	d
Ze	ddddZ
e
jdddddZ
edddddZedddddZedddddZedd dddZed#ddddddZejfdd d fd!d"Z  ZS )$rt   zweakref.ref[Type[Any]]_clsTz?util.OrderedDict[weakref.ref[Type[Any]], _DeferredMapperConfig]_configsr[   ra   r   c                 C  s   d S rN   rO   r   rO   rO   rQ   r     s    z$_DeferredMapperConfig._early_mappingrp   rb   c                 C  s   |   S rN   )r  rc   rO   rO   rQ   rr     s    z_DeferredMapperConfig.cls)r   rM   c                 C  s    t || j| _| | j| j< d S rN   )weakrefref_remove_config_clsr  r  )rP   r   rO   rO   rQ   rr     s    )r  rM   c                 C  s   | j |d  d S rN   )r  rl  )rr   r  rO   rO   rQ   r    s    z(_DeferredMapperConfig._remove_config_clsry   c                 C  s   t |tot|| jv S rN   )r   r   r  r  r  rr   r   rO   rO   rQ   ru     s    z_DeferredMapperConfig.has_clsr   c                 C  s2   t |dr|  tj|dt| ddd S )N_sa_raise_deferred_configr   zG has a deferred mapping on it.  It is not yet usable as a mapped class.)r]  )r   r  orm_excZUnmappedClassErrorZ_safe_cls_namer  rO   rO   rQ   raise_unmapped_for_cls  s    
z,_DeferredMapperConfig.raise_unmapped_for_clsc                 C  s   | j t| S rN   )r  r  r  r  rO   rO   rQ   rv     s    z$_DeferredMapperConfig.config_for_clszList[_DeferredMapperConfig])base_clssortrM   c                   sr   fdddd | j  D D }|s*|S dd |D  g } D ] | fddjD  q@tt||S )Nc                   s&   g | ]\}}|d urt | r|qS rN   )r   )r  mr   )r  rO   rQ   r    s   z:_DeferredMapperConfig.classes_for_base.<locals>.<listcomp>c                 S  s   g | ]}||j fqS rO   rw   r  r  rO   rO   rQ   r    rS   c                 S  s   i | ]}|j |qS rO   rw   r  rO   rO   rQ   r    rS   z:_DeferredMapperConfig.classes_for_base.<locals>.<dictcomp>c                 3  s&   | ]}| v r |   fV  qd S rN   rO   )r  r  )all_m_by_clsm_clsrO   rQ   r    s   z9_DeferredMapperConfig.classes_for_base.<locals>.<genexpr>)r  valuesextendr   r  r5   r  )rr   r  r  classes_for_baseZtuplesrO   )r  r  r  rQ   r  	  s    

z&_DeferredMapperConfig.classes_for_baser   c                   s   | j | jd  t |S rN   )r  rl  r  r   r   r   r   rO   rQ   r   !  s    z_DeferredMapperConfig.map)T)rH   rT   rU   rW   r  r0   r   r  r   propertyrr   setterr   r  ru   r  rv   r  r   r   r   rO   rO   r   rQ   rt     s*   

 rt   zMapperProperty[Any]ra   )rr   r   r   rM   c                 C  s6  d| j v r$td| }ddddd}t|tr\t|| ||j|dd |j|| nt|tr|j	}|j
D ]6\}}t|| ||j|dd |sr|j|| qr|r|j|| ndt|tr|j|| nJt|tr
|j|kr
t|j}|j|| nt| || |j  nt| || d	S )
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.

    rJ   rx  r4   )mcrM   c                 S  s*   t | jtr| jS td| jdd S )Nz+Cannot add a new attribute to mapped class z) because it's not mapped against a table.)r   rK   r4   r   r   rH   )r  rO   rO   rQ   _table_or_raise3  s
    z'_add_attribute.<locals>._table_or_raiseT)Zreplace_existingN)r   r   r   r3   rm  r  rJ   Zadd_propertyr%   rs  rt  r&   r   r   r    r   __setattr___expire_memoizations)rr   r   r   Z
mapped_clsr  mprv  rO  rO   rO   rQ   _add_attribute&  s8    







r  )rr   r   rM   c                 C  sv   d| j v rf|| j v rftd| jjsf| j | }t|ttttfrHt	dqrt
| | td| j  nt
| | d S )NrJ   rx  z<Can't un-map individual mapped attributes on a mapped class.)r   r   rJ   Z_dispose_calledr   r3   r%   r&   r   r   r   __delattr__r  )rr   r   r   rO   rO   rQ   _del_attributeZ  s(    
r  )rP   kwargsrM   c                 K  sB   t | }|D ]0}t||s,td||jf t| |||  qdS )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)r   r   rT  rH   r*  )rP   r  r   rG  rO   rO   rQ   _declarative_constructorr  s    

r  r   zColumn[Any])r   columnrM   c                 C  s$   |j d u r| |_ |jd u r | |_d S rN   )r   r   )r   r  rO   rO   rQ   rm    s    

rm  )F)rrV   
__future__r   r=  r   r  typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   Z_typingr   r   r   r   r   r   r   Zdescriptor_propsr   r    Z
interfacesr!   r"   r#   r$   r%   r&   Zmapperr'   r   r(   r)   r0   r*   r+   r,   r-   r/   sqlr1   Zsql.baser2   Z
sql.schemar3   r4   r5   Zutil.typingr6   r7   r8   r9   r:   r;   r<   r=   r>   r  r?   r@   Zsql.elementsrA   rB   Zsql.selectablerC   rD   rG   r[   Z_TableArgsTyperF   rX   rf   rx   r~   r   r}   r   r   r   Zpreload_moduler   r   r   r   r   r   r  rt   r  r  r  rH   rm  rO   rO   rO   rQ   <module>   s    '
Z>
            M4