U
    ovgXE                    @  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   </tmp/pip-unpacked-wheel-uqd9otp_/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 krd S | jddrB| jD ]}t|}|d k	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t t| tsdS || jkr.t| |S | jdd D ]D}t|dk	}||jkr<|| ksr|rn|| jk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)AssertionError
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|k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              	     sh   t  ||| | d|| _tj: |ddsFt| j	| j
|j | | | | W 5 Q R X 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|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 krg }|jD ]0}t|}|d kr:q$t|r$||k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                      s2  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d2d3d4d5hZ	e
d6Zd7d8d/d9d:Zd*d+d;d<Zd*d+d=d>Zed%d?d@dAdBZedCd%d?d*dDdEdFZedCd*dGdHdIZdJdKd7dLdMdNdOdPdQZd7dJdMd*dRdSdTZd8d.dd7dUdVdWdXZd*d+dYdZZd*d+d[d\Zdpdd*d^d_d`ZdadbdcdddeZd&d*dfdgdhZd&d*dfdidjZd&d*dfdkdlZejfd&dmdfdndoZ   Z!S )qr   )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           	   	     s@  |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R t !| j"| j|j# | $| | %  | &  | '| | (| | )| W 5 Q R X 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     s^    
  
  

	  


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  | ||k	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 k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 kr|j|j   qS rO   r   r  r  rO   rQ   r  q  s   
 c                   s   t |r|j}|  }t |r(|j}||kr4dS | k	r@dS |  }t| |}||krddS | k	rzt|trzdS ||krdS | k	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_checkerrK   r\   rZ   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| k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k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  s0    
  z)_ClassScanMapperConfig._cls_attr_resolverc              	     s  | j }td| | j}| j}| j}| j}d }d  }}d }	d }
d|k}| | j }g }|jD ]R}||k	olt|}| 	|}|s||k	r| 
||||}ni }|||||f qZ|D ]\}}}}|| | D ]\}}}}||k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||k	rd}n
dstq|r,t|r|jstd|j|||f  qq||k	rt|ttfrLqАqt|trftdqt|rt|d k	s~t|j r||k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 kr\|j*|_)| +||, |d| n:t-|||r|s||ks||d stqn| .||| q|r||ks|| |k	r|||rtt|r|% }|||< | +|||d| q| +|||d |}|d k	o0|j/d k	}|d k	rB|j0n|}|d krv|sv|rv|d k	rj|nt ||< q||kr|||< qq|r|
sd }|| _1|
| _2|| _3|	| _4d 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)5rr   r   r   r   r   r  r  r   r~   r   _produce_column_copiesr   updater   rZ   r^   r   tupler!  r   r   ArgumentErrorr   r   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     s   





  	
  
  
   






 

        

z'_ClassScanMapperConfig._scan_attributesc              	     s  j }|sd S djjkr.tdj ddjjkrNtdj dttdddd	fd
d t	j}|d k	st
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sPt
|
||	< 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 k	r"d|jkr"| |  dS )Nr4  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 k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   )r6  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  u  s     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   r   itemsr0   Zwarn_deprecatedjoinr   r+  _apply_dataclasses_to_any_class)rP   r   r   Z
field_listr   Znon_dc_attrsr   defaultsitemr   tpspeckvrO   )r6  rP   r5  rQ   r     s^    

'(




  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requiredr2  expect_mapped)r0   r  r@  r+   r*   rT   r   )	rr   rI  r  Znew_annor   r1  	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kr"tj}|r@t|dd }td||_nd }zjz||fdd | D  W nF t	t
fk
r } z$tjd|jd|dd	d
|W 5 d }~X Y nX W 5 |r|d kr|`n||_X d S )Nrn   rW   r   c                 S  s(   i | ] \}}|t jk	r|d kr||qS )rn   )r2   r7  )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   r7  r   Z	dataclassr   r   rW   r@  	TypeError
ValueErrorr   r   rH   )rr   r   rI  rQ  rn   ZrestoredexrO   rO   rQ   rB    s6    

z6_ClassScanMapperConfig._apply_dataclasses_to_any_class)	argumentsrM   c                 C  sT   ddddddddh}t ||}|rPd	d
d t|D }td| dd S )Nrg   rh   rj   ri   rk   rm   rl   rn   r9  c                 s  s   | ]}|V  qd S rN   rO   )r  argrO   rO   rQ   r    s     z>_ClassScanMapperConfig._assert_dc_arguments.<locals>.<genexpr>zDataclass argument(s) z are not accepted)set
differencerA  sortedr   r)  )rr   rV  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 kr| j | S |d kr d S | j}| j}|d kr`t|tj}| o\| o\|d kp\t|t}nd}d}t|| j|j	|t
|d||o| d}	|	d krd S |	\}
}|d k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_unmappedr2  rM  r   r   elemcarO   rO   rQ   r-    sl    

	
  

	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 krt|||r||	|
rNq| |	||d|
}|d k	rn|jn|
}
|
d krt }
|
||	< t||	|
 qt|
t	tfr||	|
rq| |	||d|
}|d k	r|jn|
}
|	|krd|kr t
|
dd p|	|d jks|
jr:|
jD ]*}|jd k	r|jjd k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_keysZ_table_columnr   r   r   Z_copy)rP   rc  r   r/  r   rr   r   Zlocally_collected_attributesr   r   r   r1  r   r3  ZfkZcopy_rO   rO   rQ   r&  O  s|    	

    
    


z-_ClassScanMapperConfig._produce_column_copiesc                   s  | j }| j}| j}| j}t|ddd}| j}|p4| j}t| j}t	|D ]}	|	|krXqH||	  t
 r jr~td| j   t||	 n4t tr j|k	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krrtd	|	 d
nvt trt |	| j!"   nRt t#r>| j$"|	d\}
}}}}}}|d k	s|
d ks|r4z  %| | j&|||	||
||	 W n8 t'k
r0 } zt(d|
 d|W 5 d }~X Y nX n
|s>t)t tr j*r|st t+rrddddg}n
dddg} 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   defaultc                   s(   h | ] }t  jd | tjk	r|qS )Zdataclasses_)r   Z_attribute_optionsr2   r7  r  ar   rO   rQ   	<setcomp>H  s    zF_ClassScanMapperConfig._extract_mappable_attributes.<locals>.<setcomp>r`  ra  z# includes dataclasses argument(s): r9  c                 s  s   | ]}t |V  qd S rN   r:  rf  rO   rO   rQ   r  R  s     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)  r   Z_has_dataclass_argumentsr&   rA  rZ  r%   )rP   rr   r   	our_stuffr  Zlate_mappedr   Zexpect_annotations_wo_mappedZlook_for_dataclass_thingsrG  r1  r   r   r   r   r   r   neargnamesargsrO   rh  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 krZ||jkrZ|||< qZq(t|tr(|jd k	st||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 insteadr9  )r   r   r   r>  r?  rX  r  r@  r   r%   mapper_property_to_assigncolumns_to_assignr   r   addr   r3   r   r   r0   r   r   rA  rZ  )rP   rm  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 kr>d|kr>|d kr>t
|drzttt t|j}	nt}	|d k	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|	|| |f||
|}nZ|d krh| j	rb| d| 	 }n|j}|r|D ]$}|j|srtd|j qr|| _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_callablerw  r   r!  r(  r   rZ  r   _metadata_for_clsrK   r   Zcontains_columnr   r)  r   r   )rP   r   rr   r#  r   r   r   r   r   Z	table_clsrp  Ztable_kwry  rz  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 k	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 krg }|jD ]0}t|}|d kr:q$t|r$||kr$|| q$|rt|dkrxtd||f |d }nt	|t
r|j}|| _| j}d|kr| jd k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 krF| jd krFt|dsFtd| n| jr\t| j}|d k	sdt	|j }|j
}|d kr\|rtd|rt|tstd| j d| j d|D ]}	|d k	st	|	j|jkr|j|	j |	krqtd|	 d|j d	|j|	j  d
|	jr tdtr6t|ts6t	||	 |d k	r||k	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 'ra  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)  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_selectablert  rO   rO   rQ   r     sh    

 
z0_ClassScanMapperConfig._setup_inheriting_columnsc                   s  j }jr }ni }|r(|| d|krFt|}||d  dD ]&}||krJ|| }j||||< qJd|krfddt|d D |d< d|kr|d }t|t	r|j
}|jk	rtd|d  jrj|d< jr|dd	stjd	  j}d
|krX fdd|jD  jp6d |d
< }|dd jD  t| D ]N\}}	t|	tjs~qd| jk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 kr|jqS rO   )Z_columntopropertyr   r  r   )inherited_mapperrO   rQ   ri    s   
zC_ClassScanMapperConfig._prepare_mapper_arguments.<locals>.<setcomp>rO   c                 S  s   g | ]
}|j qS rO   r}  r  rO   rO   rQ   r    s     )r   r   r'  r!  r   r   r0   Zto_listr   r'   r   r   r   r   r,   r   r   unionr  difference_updater   r  r@  r1   rb  Z_propsr(   columnscopyr   )rP   r   r   r   rG  rH  Zinherits_argr  r  rt  pZresult_mapper_argsrO   )r  rP   rQ   _prepare_mapper_argumentsg  sf    











z0_ClassScanMapperConfig._prepare_mapper_argumentsr   c                 C  sL   |  | t| jdr,tdt| jj}nt}| d|| j| j	f| 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  rB  rR  r-  r.  r&  r   r   r   r  r   r   r  r0   r   r   r   rO   rO   r   rQ   r     sj   

MM
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  rj  )rr   r  rO   rO   rQ   r    s    z(_DeferredMapperConfig._remove_config_clsry   c                 C  s   t |tot|| jk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 k	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    s     c                 S  s   i | ]}|j |qS rO   rw   r  rO   rO   rQ   r    s      z:_DeferredMapperConfig.classes_for_base.<locals>.<dictcomp>c                 3  s&   | ]}| k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  rj  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 k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   rv  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   rk  r  rJ   Zadd_propertyr%   rq  rr  r&   r   r   r    r   __setattr___expire_memoizations)rr   r   r   Z
mapped_clsr  mprt  rO  rO   rO   rQ   _add_attribute&  s<    



 

 

r  )rr   r   rM   c                 C  sv   d| j krf|| j krftd| jjsf| j | }t|ttttfrHt	dqrt
| | td| j  nt
| | d S )NrJ   rv  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   rS  rH   r+  )rP   r  r   rG  rO   rO   rQ   _declarative_constructorr  s    

r  r   zColumn[Any])r   columnrM   c                 C  s$   |j d kr| |_ |jd kr | |_d S rN   )r   r   )r   r  rO   rO   rQ   rk    s    

rk  )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   _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/   Z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   rk  rO   rO   rO   rQ   <module>   s    '
Z>
            M4