o
    hdE                    @  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rd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\ddRdSZ]ddUdVZ^ddXdYZ_	Zddd_d`Z`ddcddZaddjdkZbddqdrZce6ddsddvdwZeddydzZfG d{d| d|ZgG d}d~ d~egZhG dd deZiG dd degZje6ddsdddZkG dd dejZldddZmdddZndddZodeo_pddd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                   @  s4   e Zd ZU dZded< ded< de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__kwr   returnr   c                 K     d S N )selfrL   rP   rP   l/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/sqlalchemy/orm/decl_base.py__call__e       zMappedClassProtocol.__call__N)rL   r   rM   r   )rH   
__module____qualname____doc____annotations__rS   rP   rP   rP   rR   rF   Z   s   
 rF   c                   @  sN   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Z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_transformsrM   Nonec                 C  rN   rO   rP   rQ   rP   rP   rR   __declare_first__q   rT   z*_DeclMappedClassProtocol.__declare_first__c                 C  rN   rO   rP   rc   rP   rP   rR   __declare_last__s   rT   z)_DeclMappedClassProtocol.__declare_last__NrM   rb   )rH   rU   rV   rW   rX   rd   re   rP   rP   rP   rR   rY   h   s   
 
rY   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   rU   rV   rX   rP   rP   rP   rR   rg   v   s   
 rg   cls	Type[Any]rM   3Optional[Union[_DeferredMapperConfig, Mapper[Any]]]c                 C  s,   t | r
t | S t| rt| ddS d S )NF)	configure)_DeferredMapperConfighas_clsconfig_for_clsr   r,   rq   rP   rP   rR   _declared_mapping_info   s
   

ry   boolc                 C  s*   t | rt| ddd S t| r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strictF)ru   rv   _get_immediate_cls_attrr   rx   rP   rP   rR   _is_supercls_for_inherits   s   
r   Optional[Type[Any]]c                 C  sX   | t u rd S | jddr!| jD ]}t|}|d ur|  S qd S t| }|r*|jS | S )N__abstract__F)object__dict__get	__bases__"_resolve_for_abstract_or_classical_dive_for_cls_managerclass_)rq   base_sup
clsmanagerrP   rP   rR   r      s   
r   FattrnamerG   r}   Optional[Any]c                 C  s   |dksJ t | tsdS || jv rt| |S | jdd D ]#}t|du}||jv rA|| u s:|r7|| jv rAn	 |sAt||  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   )
issubclassr   r   getattr__mro__r   r   )rq   r   r}   base_is_classical_inheritsrP   rP   rR   r~      s"   



r~   Type[_O]Optional[ClassManager[_O]]c                 C  s&   | j D ]}t|}|r|  S qd S rO   )r   r   opt_manager_of_class)rq   r   managerrP   rP   rR   r      s   
r   registryr=   dict_r<   Optional[_MapperConfig]c                 C  s   t | ||d i S rO   )_MapperConfigsetup_mapping)r   rq   r   rP   rP   rR   _as_declarative   s   r   tableOptional[FromClause]	mapper_kwr\   rI   c                 C  s   t | ||| td|jS )NzMappedClassProtocol[_O])_ImperativeMapperConfigr   rJ   )r   rq   r   r   rP   rP   rR   _mapper   s   r   zsqlalchemy.orm.decl_apiobjr   c                 C  s   t jjj}t| |t jfS rO   )r0   	preloadedorm_decl_api_declared_attr_common
isinstanceclassproperty)r   r   rP   rP   rR   _is_declarative_props  s   
r   namec                 C  s.   t | rt| ddrtd||f  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   rq   rP   rP   rR   _check_declared_props_nocascade  s   r   c                   @  sj   e Zd ZU dZded< ded< ded< ded	< ed'ddZd(ddZd)ddZd*d+d!d"Z	d,d$d%Z
d&S )-r   )rq   	classname
propertiesdeclared_attr_reg__weakref__rr   rq   rG   r   z_util.OrderedDict[str, Union[Sequence[NamedColumn[Any]], NamedColumn[Any], MapperProperty[Any]]]r   zDict[declared_attr[Any], Any]r   r   r=   cls_r   r   r<   r   r   r   r\   rM   r   c                 C  sx   t | }|r|j|u rtd| d|jddrd S t|dddp)t|d}|r4t	|||||S t
|||||S )	NClass z, already has been instrumented declarativelyr   Fr{   Tr|   _sa_decl_prepare)r   r   r   r   InvalidRequestErrorr   r   r~   hasattrru   _ClassScanMapperConfig)rq   r   r   r   r   r   r   	defer_maprP   rP   rR   r   *  s&   
	


z_MapperConfig.setup_mappingc                 C  sz   t |td| _|j| _t  | _i | _|	dds(t
j| jd|| |jd d S t| j}|r3|js;td| j d S )Nr   non_primaryF)finalizer   declarative_scaninit_methodztClass %s has no primary mapper configured.  Configure a primary mapper first before setting up a non primary Mapper.)r0   assert_arg_typetyperq   rH   r   OrderedDictr   r   r   r   register_classconstructorr   r   	is_mappedr   r   )rQ   r   r   r   r   rP   rP   rR   __init__I  s(   


z_MapperConfig.__init__r   valuerD   c                 C  s   t | j}||| |S rO   )r   manager_of_classrq   install_member)rQ   r   r   r   rP   rP   rR   set_cls_attributee  s   z_MapperConfig.set_cls_attribute.Mapper[Any]c                 C  s   t  rO   )NotImplementedErrorrQ   r   rP   rP   rR   mapj     z_MapperConfig.maprb   c                 C  s   |  | d S rO   )r   r   rP   rP   rR   _early_mappingm  s   z_MapperConfig._early_mappingN)r   r=   r   r   r   r<   r   r   r   r\   rM   r   )r   r=   r   rr   r   r\   )r   rG   r   rD   rM   rD   ).r   r\   rM   r   r   r\   rM   rb   )rH   rU   rV   	__slots__rX   classmethodr   r   r   r   r   rP   rP   rP   rR   r     s   
 

r   c                      s<   e Zd ZdZd fd
dZejfdddZ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s#t| j	| j
|j | | | | W d    d S 1 s8w   Y  d S )NrK   r   F)superr   r   r   r   _CONFIGURE_MUTEXr   r   	add_classr   rq   _class_registry_setup_inheritancer   )rQ   r   r   r   r   	__class__rP   rR   r   t  s   
"z _ImperativeMapperConfig.__init__rM   r   c                 C  s"   t }| d|| j| jfi |S )NrJ   )r'   r   rq   r   rQ   r   
mapper_clsrP   rP   rR   r     s
   z_ImperativeMapperConfig.maprb   c                 C  s   | j }|dd }|d u rAg }|jD ]}t|}|d u rqt|r*||vr*|| q|r@t|dkr<td||f |d }nt	|t
rI|j}|| _d S )Nr   r   &Class %s has multiple mapped bases: %rr   )rq   r   r   r   r   appendlenr   r   r   r'   r   r   )rQ   r   rq   r   inherits_searchr   crP   rP   rR   r     s.   



z*_ImperativeMapperConfig._setup_inheritance)r   r=   r   r   r   r   r   r\   r   r   )
rH   rU   rV   r   r   r0   
EMPTY_DICTr   r   __classcell__rP   rP   r   rR   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_annotationrz   is_dataclassr   
attr_valuerG   originating_modulerr   originating_classNrp   rP   rP   rP   rR   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$< 	 du fd+d,Zdvd/d0Zdwd3d4Zh d5Z	e
d6Zdxd9d:Zdvd;d<Zdvd=d>ZedydAdBZedzdEdFZed{dHdIZd|dTdUZd}dXdYZd~d^d_Zdvd`daZdvdbdcZdddedfZddjdkZddldmZddndoZddpdqZejfddsdtZ   Z!S )r   )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   rz   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pBt| j| _t| | _}t|d}|rU|r\|r\tdt|o`|| _|   |   |   tj/ t !| j"| j|j# | $| | %  | &  | '| | (| | )| W d    d S 1 sw   Y  d S )NFra   __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   immutabledictr   r   r   r   r   r   r   r   
OrderedSetr   r   r   r   r   rq   r   rz   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   )	rQ   r   r   r   r   r   dcacldsdkr   rP   rR   r     sT   



	


"z_ClassScanMapperConfig.__init__rM   rb   c                   sT   t  jdrttdd fdd}t  jdr(ttdd fd	d
}d S d S )Nre   after_configuredrM   rb   c                        t d j  d S N_DeclMappedClassProtocol[Any])r   rq   re   rP   rc   rP   rR   r  I     
zG_ClassScanMapperConfig._setup_declared_events.<locals>.after_configuredrd   before_configuredc                     r  r  )r   rq   rd   rP   rc   rP   rR   r  Q  r  zH_ClassScanMapperConfig._setup_declared_events.<locals>.before_configuredrf   )r~   rq   r/   listens_forr'   )rQ   r  r  rP   rc   rR   r  F  s   

z-_ClassScanMapperConfig._setup_declared_eventsrq   Callable[[str, Any], bool]c                   sz   | j r	tdndsdfd	d
}|S fddtD fddtD t  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   NkeyrG   r   r   rM   rz   c                   s   t  | ||uS rO   )r   )r  r   rx   rP   rR   attribute_is_overriddenh  s   zR_ClassScanMapperConfig._cls_attr_override_checker.<locals>.attribute_is_overriddenc                   $   i | ]} |j v r|j|j   qS rP   rZ   r   .0fsa_dataclass_metadata_keyrP   rR   
<dictcomp>l  
    
zE_ClassScanMapperConfig._cls_attr_override_checker.<locals>.<dictcomp>c                   r  rP   r  r  r  rP   rR   r  q  r   c                   s   t |r|j}|  }t |r|j}||u rdS | ur dS |  }t| |}||u r2dS | ur=t|tr=dS ||u rCdS | urIdS dS )NFT)r   fgetr   r   r   r   )r  r   ret	all_field)absentall_datacls_fieldsrq   local_datacls_fieldsrP   rR   r  y  s,   
)r  rG   r   r   rM   rz   )r   r~   r0   dataclass_fieldslocal_dataclass_fieldsr   )rQ   rq   r  rP   )r$  r%  rq   r&  r  rR   _cls_attr_override_checkerW  s"   9

(z1_ClassScanMapperConfig._cls_attr_override_checker>   rK   r[   r_   r]   z^(?:_sa_|__)rr   2Callable[[], Iterable[Tuple[str, Any, Any, bool]]]c                   s   t |t|| j | j fddt ttD | jr*t|dnds9dfdd}|S d	d
 t 	|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 rP   )match)r  n)_include_dunders_match_exclude_dundersrP   rR   
<listcomp>  s    z=_ClassScanMapperConfig._cls_attr_resolver.<locals>.<listcomp>r   NrM   $Iterable[Tuple[str, Any, Any, bool]]c                     s    fddD S )Nc                 3  s(    | ]}| |  |d fV  qdS )FNr   )r  r   )cls_annotationscls_varsrP   rR   	<genexpr>  s    
z`_ClassScanMapperConfig._cls_attr_resolver.<locals>.local_attributes_for_class.<locals>.<genexpr>rP   rP   )r2  r3  namesrP   rR   local_attributes_for_class  s   zM_ClassScanMapperConfig._cls_attr_resolver.<locals>.local_attributes_for_classc                 S     i | ]}|j |qS rP   )r   )r  fieldrP   rP   rR   r    s    z=_ClassScanMapperConfig._cls_attr_resolver.<locals>.<dictcomp>c                  3  sf    D ]-}  | d }|r#|jv r#|jt|j  |jdfV  q|  |   | dfV  qd S )NTF)r   rZ   r   _as_dc_declaredattr)r   r8  )r2  r3  r'  fixed_sa_dataclass_metadata_keyr5  r  rP   rR   r6    s   )rM   r0  )
r0   get_annotationsvarsr-  r.  merge_lists_w_orderinglistr   r~   r(  )rQ   rq   r6  rP   )r-  r.  r2  r3  r'  r:  r5  r  rR   _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 ])}||uo6t|}| 	|}|sK||urK| 
||||}ni }|||||f q-|D ]\}}}}|| | D ]\}}}}||v r|dkrt|||}|s|r|rd fdd}|}qh|dkrt|||}|
s|r|r j}
qh|dkrt|||}|r|	sd fd
d}|}	qh|dkrt|||}|s|r|r j}t|tttd fstd||urd}qhJ |rt|r|jstd|j|||f  qh||urt|ttfrqht|trtdt|r|d usJ |jrF||v r1td||f  | || ||<  ||< }t!||| n6|rZt"||d }t|t#sY|$ }nt"||}t|t#rtt%|rtt|j&tst|j'}| ||< ||< t|ttfr|j(d u r|j)|_(| *||+ |d| qht,|||r|s||v s||d sJ qh| -||| qh|r||vs|| |ur|||rJ t|r|$ }|||< | *|||d| qh| *|||d |}|d uo|j.d u}|d ur|j/n|}|d u r|s|r|d ur|nt ||< qh||v r&|||< qhqY|r0|
s0d }|| _0|
| _1|| _2|	| _3d S )Nr  rK   r]   rM   r   c                     s
   t  jS rO   )dictr]   rP   cls_as_DeclrP   rR   _mapper_args_fnA  s   
z@_ClassScanMapperConfig._scan_attributes.<locals>._mapper_args_fnr[   rC   c                     s    j S rO   )rK   rP   rA  rP   rR   	_table_fnW  r   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)rM   r   )rM   rC   )4rq   r   r   r   r   r-  r)  r   r   r?  _produce_column_copiesr   updater   r[   r_   r   tupler@  r   r   ArgumentErrorr   _quietr0   r   rH   r3   r)   r&   r   r   __get__setattrr   r   r!  r   original_property
descriptordocrW   _collect_annotation_collect_return_annotationr+   _warn_for_decl_attributesr   r   r   r   r   r   )rQ   rq   r   r   r   r-  r   r   inherited_table_argsr   r   fixed_tabler  basesr   class_mappedr6  locally_collected_columnsr   r   
annotationis_dataclass_field
check_declrC  rD  r"  collected_annotationr   generated_objrP   rA  rR   r    sv  



	













  j
z'_ClassScanMapperConfig._scan_attributesc              	     s|  j }|sd S djjv rtdj ddjjv r'tdj dttdfdd t	j}|d us@J fdd fddj
 D D }rz D ]\}}tjdj dddd |D  d| dddd qZi }i }|D ]#}t|dkr|\}	}
nt|dkr|\}	}
}|||	< nJ |
||	< q| D ]\}}tj|| q|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__' elementr  rG   r   rr   rM   rz   c                   s&   | j urd|jvr| |  dS )Nr\  T)rq   r   r   )r  r   )rQ   warn_for_non_dc_attrsrP   rR   _allow_dataclass_field:  s   

zT_ClassScanMapperConfig._setup_dataclasses_transforms.<locals>._allow_dataclass_fieldc                   s.   g | ]\}}}t ||| j|tjqS rP   )r!   !_get_arguments_for_make_dataclassr   r   r2   NO_ARG)r  r  annor   rc   rP   rR   r/  H  s    zH_ClassScanMapperConfig._setup_dataclasses_transforms.<locals>.<listcomp>c           	      3  sX    | ]'\}\}}}}}}} ||r)|j vstj | ts||r$|n||fV  qd S rO   )r   r   r   )	r  r  raw_annor   mapped_annois_dcr   r   r   )r^  rQ   rP   rR   r4  O  s.    


zG_ClassScanMapperConfig._setup_dataclasses_transforms.<locals>.<genexpr>zWhen transforming z to a dataclass, attribute(s) , c                 s      | ]}t |V  qd S rO   ri   )r  r  rP   rP   rR   r4  w      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.0dcmxcoder.      F)r  rG   r   rr   rM   rz   )r   rq   r   r   r   collectionsdefaultdictr>  r   r   r   itemsr0   warn_deprecatedjoinr   rK  _apply_dataclasses_to_any_class)rQ   r   r   
field_listr   non_dc_attrsr   defaultsitemr   tpspeckvrP   )r^  rQ   r]  rR   r    sb   

'





z4_ClassScanMapperConfig._setup_dataclasses_transformsklass!Mapping[str, _AnnotationScanType]c           	      C  sl   t |}i }| D ](\}}t|||r/t|||j|td dddd}|r.|\}}|||< q|||< q|S )NFrequiredrX  expect_mapped)r0   r;  ro  r+   r*   rU   r   )	rq   r{  r2  new_annor   rW  	extractedinner_rP   rP   rR   (_update_annotations_for_non_mapped_class  s(   


z?_ClassScanMapperConfig._update_annotations_for_non_mapped_classrg   use_annotationsc              
   C  s   |  | |d }|tju rtj}|r t|dd }td||_nd }zBz||fi dd | D  W n t	t
fyR } ztjd|jd|dd	d
|d }~ww W |rc|d u r^|`d S ||_d S d S |rq|d u rn|`w ||_w )Nro   rX   r   c                 S  s(   i | ]\}}|t jur|d kr||qS )ro   )r2   r`  )r  ry  rz  rP   rP   rR   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.dcterj  )_assert_dc_argumentsr2   r`  r  	dataclassr   r   rX   ro  	TypeError
ValueErrorr   r   rH   )rq   r   r{  r  ro   restoredexrP   rP   rR   rr    sL   




z6_ClassScanMapperConfig._apply_dataclasses_to_any_class	argumentsc                 C  sH   h d}t ||}|r"ddd t|D }td| dd S )N>   rj   rh   ri   rk   rn   rm   rl   ro   re  c                 s  s    | ]}|V  qd S rO   rP   )r  argrP   rP   rR   r4    s    z>_ClassScanMapperConfig._assert_dc_arguments.<locals>.<genexpr>zDataclass argument(s) z are not accepted)set
differencerq  sortedr   rH  )rq   r  alloweddisallowed_argsmsgrP   rP   rR   r    s   

z+_ClassScanMapperConfig._assert_dc_argumentsr   rG   r   r6   r   r  Optional[bool]r   r   Optional[_CollectedAnnotation]c              
   C  s  || j v r
| j | S |d u rd S | j}| j}|d u r0t|tj}| o.| o.|d u p.t|t}nd}d}t|| j|j	|t
|d||oD| d}	|	d u rMd S |	\}
}|d u rzt|
szt|
D ]}t|dddrpt| j||j	dd}t|try| }q]t|||
|||j	| | j |< }|S )NFr}  T)check_genericcheck_for_plain_string)include_generic)r   r   r   r   r  Fieldr$   r*   rq   rU   r   r9   r7   r8   r-   r#   found_in_pep593_annotatedr   )rQ   r   r   r   r  r   r   allow_unmappedrX  r  r   r   elemcarP   rP   rR   rO    sj   

	

	z*_ClassScanMapperConfig._collect_annotationr  r   c                 C  s,   t |tjrtd| d| d d S 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   )rQ   rq   r  r   rP   rP   rR   rQ  B  s
   z0_ClassScanMapperConfig._warn_for_decl_attributesattributes_for_classr  rS  0Dict[str, Union[Column[Any], MappedColumn[Any]]]c                 C  sX  | j }| j}i }| j}| D ]\}	}
}}|sJ|
d u rJt|||rJ||	|
r&q| |	||d|
}|d ur6|jn|
}
|
d u r?t }
|
||	< t||	|
 qt|
t	tfr||	|
rWq| |	||d|
}|d urg|jn|
}
|	|vrd|v r~t
|
dd px|	|d jv s|
jr|
jD ]}|jd ur|jjd u rt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:.)rq   r   r   r+   rO  r   r)   rK  r   r3   r   r   foreign_keys_table_columnr   r   r   _copy)rQ   r  r  rS  r   rq   r   locally_collected_attributesr   r   r   rW  r   rZ  fkcopy_rP   rP   rR   rE  O  sf   	







z-_ClassScanMapperConfig._produce_column_copiesc                   s  | j }| j}| j}| j}t|ddd}| j}|p| j}t| j}t	|D ]:}	|	|v r,q$||	  t
 rE jr?td| j   t||	 nt tr_ j|ur_ j|	kr_t j t||	  t tr{t dkr{t d ttfr{td|	  q$|rt tjrq$t ttfs||	 | ||	  |st||	  q$|	dv rtd	|	 d
t trt |	| j!"   nt t#r	| j$"|	d\}
}}}}}}|d us|
d u s|rz %| | j&|||	||
||	 W n t'y } z
t()d|
 d|d }~ww |s	J t tr[ j*rG|sGt t+r!g d}ng d} fdd|D }t,d|	 d| dd-t.dd |D  dt t+t/fs[||	 t||	  q$ ||	< q$d S )Nr{   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?)rZ   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.)rh   default_factoryri   default)rh   r  ri   c                   s(   h | ]}t  jd | tjur|qS )dataclasses_)r   _attribute_optionsr2   r`  r  ar   rP   rR   	<setcomp>H  s    zF_ClassScanMapperConfig._extract_mappable_attributes.<locals>.<setcomp>r  r  z# includes dataclasses argument(s): re  c                 s  rf  rO   rg  r  rP   rP   rR   r4  T  rh  zF_ClassScanMapperConfig._extract_mappable_attributes.<locals>.<genexpr>zF but class does not specify SQLAlchemy native dataclass configuration.)0rq   r   r   r-  r~   r   r   rz   r   r>  r   r   r0   r   r   r   r   r   r  r    rK  rG  r   r3   r$   r  r  r"   poprQ  r   r   _undefer_column_namer   r   r#   r   r   r   	NameErrororm_excMappedAnnotationError_has_dataclass_argumentsr&   rH  rq  r  r%   )rQ   rq   r   	our_stuffr-  late_mappedr   expect_annotations_wo_mappedlook_for_dataclass_thingsry  rW  r   r   r   r   r   r   neargnamesargsrP   r  rR   r    s   






	


	


 z3_ClassScanMapperConfig._extract_mappable_attributesc              
   C  s2  | j }| j}| j}tt}t| D ]c\}}t|t	rV|j
}|r'|||< n||= |jD ]'\}}	t|ts>||j | || |	||< |d u rT||jkrT|||< q-qt|trw|jd usbJ ||j | || ||jkrw||= q| D ]\}
}t|dkrtd| j|
dt|f  q|d S )Nr   zzOn class %r, Column object %r named directly multiple times, only one will be used: %s. Consider using orm.synonym insteadre  )r   r   r   rm  rn  r  r>  ro  r   r%   mapper_property_to_assigncolumns_to_assignr   r   addr  r3   r   r0   r   r   rq  r  )rQ   r  r   r   name_to_prop_keyr  r   mp_to_assigncol
sort_orderr   keysrP   rP   rR   r  n  sF   







z0_ClassScanMapperConfig._extract_declared_columnsNc                   s  | j }td|}| j}| j}| j}| j}| j t|}| j	d u rd|vr|d u rt
|dr:ttt t|j}	nt}	|d urd}
i }|rht|trN|}nt|trht|d trf|dd |d }
}n|}
|d}|rs||d< |d	}|r~d
|d< t| fddd}| d|	|| |g||
R i |}n(|d u r| j	r| d| 	 }n|j}|r|D ]}|j|std|j q|| _d S )NMappedClassProtocol[Any]rK   __table_cls__rP   r   __autoload_with__autoload_with__autoload__Tautoloadc                   s     | dS )Nr   r1  )r   r   rP   rR   <lambda>  s    z5_ClassScanMapperConfig._setup_table.<locals>.<lambda>r  z8Can't add additional column %r when specifying __table__)rq   r   r   r   r   r   r   r   r   r   r   r   r4   r0   unbound_method_to_callabler  r   r@  rG  r   r  r   _metadata_for_clsrK   r   contains_columnr   rH  r  r   )rQ   r   rq   rB  r   r   r   r   r   	table_clsr  table_kwr  r  sorted_columnsr   rP   r  rR   r	    s   










z#_ClassScanMapperConfig._setup_tabler   ClassManager[Any]rB   c                 C  s"   t | jdd }|d ur|S |jjS )NrZ   )r   rq   r   rZ   )rQ   r   metarP   rP   rR   r    s   z(_ClassScanMapperConfig._metadata_for_clsc                 C  s   | j }|dd }|d u rAg }|jD ]}t|}|d u rqt|r*||vr*|| q|r@t|dkr<td||f |d }nt	|t
rI|j}|| _| j}d|vr]| jd u r_d| _d S d S d S )Nr   r   r   r   rK   T)rq   r   r   r   r   r   r   r   r   r   r'   r   r   r   r   r   )rQ   r   rq   r   r   r   r   r   rP   rP   rR   r    s6   



z/_ClassScanMapperConfig._setup_inheriting_mapperc           
   
   C  sX  | j }| j}| j}| j}|d u r!| jd u r!t|ds!td| | jrt| j}|d us/J |j }|j	}|d u r|r@t
d|rUt|tsUt
d| j d| j d|D ]R}	|d us_J |	j|jv r|j|	j |	u rnqWt
d|	 d|j d	|j|	j  d
|	jrt
dtrt|tsJ ||	 |d ur||ur||	 qWd S d S d S )N__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 'r  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   rq   r   r   r   r~   r   r   ry   r   rH  r   r4   r   r   rH   primary_keyr   append_column_refresh_for_new_column)
rQ   r   r   rq   r   r   inherited_mapper_or_configinherited_tableinherited_persist_selectabler  rP   rP   rR   r
    st   



z0_ClassScanMapperConfig._setup_inheriting_columnsc                   s  j }jr }ni }|r|| d|v r#t|}||d  dD ]}||v r8|| }j||||< q%d|v rMfddt|d D |d< d|v rk|d }t|t	r]|j
}|jurktd|d  jrsj|d< jr|dd	stjd	  j}d
|vr fdd|jD  jpd |d
< }|dd jD  t| D ]"\}}	t|	tjsq| jv rЈ j| }
t|
tr|	g|
j ||< q| }||d< |_d S )Nr   )version_id_colpolymorphic_onr  c                   s   g | ]	} j ||qS rP   )r   r   )r  rz  rc   rP   rR   r/  ~  s    zD_ClassScanMapperConfig._prepare_mapper_arguments.<locals>.<listcomp>r   z:mapper inherits argument given for non-inheriting class %sconcreteFexclude_propertiesc                   s   h | ]
}| j vr|jqS rP   )_columntopropertyr  r  r   )inherited_mapperrP   rR   r    s
    
zC_ClassScanMapperConfig._prepare_mapper_arguments.<locals>.<setcomp>rP   c                 S  s   g | ]}|j qS rP   r  r  rP   rP   rR   r/    s    )r   r   rF  r@  r   r   r0   to_listr   r'   r   r   r   r   r,   r   r   unionr  difference_updater   r>  ro  r1   r  _propsr(   columnscopyr   )rQ   r   r   r   ry  rz  inherits_argr  r  r  presult_mapper_argsrP   )r  rQ   rR   _prepare_mapper_argumentsg  sj   













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   rq   r   r0   r  r  r'   r   r   r   r   rP   rP   rR   r     s   
z_ClassScanMapperConfig.map)
r   r=   r   r   r   r<   r   r   r   r\   rf   )rq   r   rM   r  )rq   rr   rM   r*  )r{  r   rM   r|  )r   rg   r{  r   r  r|  rM   rb   )r  rg   rM   rb   )r   rG   r   r6   r   rr   r  r  r   r   rM   r  )rq   rr   r  rG   r   r   rM   rb   )
r  r*  r  r  rS  rz   r   rr   rM   r  rO   )r   r   rM   rb   )r   r  rM   rB   r   r   )"rH   rU   rV   r   is_deferredrX   r   r  r)  r-  recompiler.  r?  r  r  r   r  rr  r  rO  rQ  rE  r  r  r	  r  r  r
  r  r0   r   r   r   rP   rP   r   rR   r     sh   
 	
M
L


D  
0x4

J

Z 
F;
N

!
HQr   field_metadatar   r  c                 C  s2   t jj}| | }t|rt||js||S |S rO   )r0   r   r   callabler   r?   )r  r  decl_apir   rP   rP   rR   r9    s
   
r9  c                      s   e Zd ZU ded< dZe Zded< d$d
dZe	d%ddZ
e
jd&ddZ
ed'ddZed(ddZed)ddZed*ddZe	d+d,dd Zejfd- fd"d#Z  ZS ).ru   weakref.ref[Type[Any]]_clsTz?util.OrderedDict[weakref.ref[Type[Any]], _DeferredMapperConfig]_configsr   r\   rM   rb   c                 C  rN   rO   rP   r   rP   rP   rR   r     s   z$_DeferredMapperConfig._early_mappingrr   c                 C  s   |   S rO   )r  rc   rP   rP   rR   rq     s   z_DeferredMapperConfig.clsr   c                 C  s    t || j| _| | j| j< d S rO   )weakrefref_remove_config_clsr  r  )rQ   r   rP   rP   rR   rq     s   r  c                 C  s   | j |d  d S rO   )r  r  )rq   r  rP   rP   rR   r    s   z(_DeferredMapperConfig._remove_config_clsrz   c                 C  s   t |tot|| jv S rO   )r   r   r  r  r  rq   r   rP   rP   rR   rv     s   z_DeferredMapperConfig.has_clsr   c                 C  s.   t |dr	|  tj|dt| dd)N_sa_raise_deferred_configr   zG has a deferred mapping on it.  It is not yet usable as a mapped class.)r  )r   r  r  UnmappedClassError_safe_cls_namer  rP   rP   rR   raise_unmapped_for_cls  s   
z,_DeferredMapperConfig.raise_unmapped_for_clsc                 C  s   | j t| S rO   )r  r  r  r  rP   rP   rR   rw     s   z$_DeferredMapperConfig.config_for_clsbase_clssortList[_DeferredMapperConfig]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 rO   )r   )r  mr   )r  rP   rR   r/    s
    z:_DeferredMapperConfig.classes_for_base.<locals>.<listcomp>c                 S  s   g | ]}||j fqS rP   rx   r  r  rP   rP   rR   r/    s    c                 S  r7  rP   rx   r  rP   rP   rR   r    s    z:_DeferredMapperConfig.classes_for_base.<locals>.<dictcomp>c                 3  s(    | ]}| v r |   fV  qd S rO   rP   )r  r  )all_m_by_clsm_clsrP   rR   r4    s    z9_DeferredMapperConfig.classes_for_base.<locals>.<genexpr>)r  valuesextendr   r>  r5   r  )rq   r  r  classes_for_basetuplesrP   )r  r  r	  rR   r  	  s   

z&_DeferredMapperConfig.classes_for_baser   c                   s   | j | jd  t |S rO   )r  r  r  r   r   r   r   rP   rR   r   !  s   z_DeferredMapperConfig.mapr   )rM   rr   )r   rr   rM   rb   )r  r  rM   rb   )r   rr   rM   rz   )r   rr   rM   r   )r   rr   rM   ru   )T)r  rr   r  rz   rM   r  r   )rH   rU   rV   rX   r  r0   r   r  r   propertyrq   setterr   r  rv   r  rw   r  r   r   r   rP   rP   r   rR   ru     s,   
 

ru   r  r   MapperProperty[Any]rb   c                 C  s8  d| j v rtd| }ddd}t|tr+t|| ||j|dd	 |j|| d
S t|tr_|j	}|j
D ]\}}t|| ||j|dd	 |sQ|j|| q6|r]|j|| d
S d
S t|trm|j|| d
S t|tr|j|krt|j}|j|| d
S t| || |j  d
S 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   r  mcrM   r4   c                 S  s&   t | jtr	| jS td| jd)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  rP   rP   rR   _table_or_raise3  s
   z'_add_attribute.<locals>._table_or_raiseT)replace_existingN)r  r  rM   r4   )r   r   r   r3   r  r  rJ   add_propertyr%   r  r  r&   r   r  r    r   __setattr___expire_memoizations)rq   r  r   
mapped_clsr  mpr  r  rP   rP   rR   _add_attribute&  s<   









r  c                 C  sv   d| j v r3|| j v r3td| jjs3| j | }t|ttttfr#t	dt
| | td| j  d S t
| | d S )NrJ   r  z<Can't un-map individual mapped attributes on a mapped class.)r   r   rJ   _dispose_calledr   r3   r%   r&   r   r   r   __delattr__r  )rq   r  r   rP   rP   rR   _del_attributeZ  s(   


r  rQ   kwargsc                 K  sB   t | }|D ]}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   r  rH   rK  )rQ   r  r   ry  rP   rP   rR   _declarative_constructorr  s   

r  r   columnColumn[Any]c                 C  s(   |j d u r| |_ |jd u r| |_d S d S rO   )r  r   )r  r  rP   rP   rR   r    s
   


r  )rq   rr   rM   rs   )rq   rr   rM   rz   )rq   rr   rM   r   )F)rq   rr   r   rG   r}   rz   rM   r   )rq   r   rM   r   )r   r=   rq   rr   r   r<   rM   r   )
r   r=   rq   r   r   r   r   r\   rM   rI   )r   r   rM   rz   )r   r   r   rG   rq   r   rM   rz   )r  r   r  rG   rM   r   )rq   rr   r  rG   r   r  rM   rb   )rq   rr   r  rG   rM   rb   )rQ   r   r  r   rM   rb   )r  rG   r  r   rM   rb   )rrW   
__future__r   rm  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   _typingr   r   r   r   r   r   r   descriptor_propsr   r    
interfacesr!   r"   r#   r$   r%   r&   mapperr'   r   r(   r)   r0   r*   r+   r,   r-   r/   sqlr1   sql.baser2   
sql.schemar3   r4   r5   util.typingr6   r7   r8   r9   r:   r;   r<   r=   r>   r  r?   r@   sql.elementsrA   rB   sql.selectablerC   rD   rG   r\   _TableArgsTyperF   rY   rg   ry   r   r   r~   r   r   r   preload_moduler   r   r   r   r   r   r9  ru   r  r  r  rH   r  rP   rP   rP   rR   <module>   s   



'



Z>
            
M
4
