U
    ÌZjÊ®  ã                   @   sð  d Z ddlm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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„ Z$dd„ Z%d@d d!„Z&d"d#„ Z'd$d%„ Z(d&d'„ Z)e *d(¡d)d*„ ƒZ+d+d,„ Z,G d-d.„ d.e-ƒZ.G d/d0„ d0e.ƒZ/G d1d2„ d2e.ƒZ0e *d(¡d3d4„ ƒZ1G d5d6„ d6e0ƒZ2d7d8„ Z3d9d:„ Z4d;d<„ Z5d=e5_6d>d?„ Z7dS )Az(Internal implementation for declarative.é    )Úabsolute_importN)Ú
attributes)Úinstrumentationé   )Úclsregistry)Úexc)Úmapper)ÚInstrumentedAttribute)ÚQueryableAttribute)Ú_is_mapped_class)ÚInspectionAttr)ÚCompositeProperty)ÚSynonymProperty)ÚMapperProperty)ÚMapper)ÚColumnProperty)Úclass_mapperé   )Úevent)Úutil)Ú
expression)ÚColumn)ÚTable)Útopologicalc                 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   ©Úcls© r    ú[/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/sqlalchemy/orm/decl_base.pyÚ_declared_mapping_info%   s
    

r"   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_)r   ÚsupZ
clsmanagerr    r    r!   r(   0   s    

r(   Fc                 C   s‚   |dkst ‚t| tƒsdS || jkr.t| |ƒS | jdd… D ]@}t|ƒ}||jkr<|| ksn|rj|| 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'   )r   ÚattrnameÚstrictÚbaseZ_is_classicial_inheritsr    r    r!   Ú_get_immediate_cls_attrD   s(    



ÿýý ý ür3   c                 C   s4   t | dƒsd S | jD ]}t |¡}|r|  S qd S )Nr/   )Úhasattrr/   r   Úmanager_of_class)r   r2   Úmanagerr    r    r!   r)   i   s    



r)   c                 C   s   t  | ||d i ¡S ©N)Ú_MapperConfigÚsetup_mapping)Úregistryr   Údict_r    r    r!   Ú_as_declarativey   s    r<   c                 C   s   t | |||ƒ |jS r7   )Ú_ImperativeMapperConfigÚ
__mapper__)r:   r   ÚtableÚ	mapper_kwr    r    r!   Ú_mapper�   s    rA   zsqlalchemy.orm.decl_apic                 C   s   t jjj}t| |t jfƒS r7   )r   Ú	preloadedÚorm_decl_apiÚdeclared_attrÚ
isinstanceZclassproperty)ÚobjrD   r    r    r!   Ú_is_declarative_props†   s    
rG   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)rG   r.   r   Úwarn)rF   Únamer   r    r    r!   Ú_check_declared_props_nocascade�   s    þÿrK   c                   @   s4   e Zd ZdZedd„ ƒZdd„ Zdd„ Zdd	„ Zd
S )r8   )r   Ú	classnameÚ
propertiesÚdeclared_attr_regÚ__weakref__c           	      C   sn   t  | ¡}|r&|j|kr&t d|  ¡‚|j dd¡r8d S t|ddd�pNt|dƒ}|rZt	}nt
}||||||ƒS )Nz4Class %r already has been instrumented declarativelyr#   FÚ_sa_decl_prepare_nocascadeT©r1   Z_sa_decl_prepare)r   r5   r*   r   ÚInvalidRequestErrorr%   r&   r3   r4   r   Ú_ClassScanMapperConfig)	r   r:   Úcls_r;   r?   r@   r6   Z	defer_mapZcfg_clsr    r    r!   r9   £   s$    
ÿ  ÿþz_MapperConfig.setup_mappingc                 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 )NrT   Únon_primaryF)Úfinalizer:   Zdeclarative_scanZinit_methodztClass %s has no primary mapper configured.  Configure a primary mapper first before setting up a non primary Mapper.)r   Zassert_arg_typeÚtyper   Ú__name__rL   ÚOrderedDictrM   rN   r&   r   Zregister_classÚconstructorr   r5   Z	is_mappedr   rR   )Úselfr:   rT   r@   r6   r    r    r!   Ú__init__¹   s&    
û
þÿz_MapperConfig.__init__c                 C   s   t  | j¡}| ||¡ |S r7   )r   r5   r   Zinstall_member)r[   r0   Úvaluer6   r    r    r!   Úset_cls_attributeÐ   s    z_MapperConfig.set_cls_attributec                 C   s   |   |¡ d S r7   )Úmap©r[   r@   r    r    r!   Ú_early_mappingÖ   s    z_MapperConfig._early_mappingN)	rX   Ú
__module__Ú__qualname__Ú	__slots__Úclassmethodr9   r\   r^   ra   r    r    r    r!   r8   š   s   
r8   c                       s6   e Zd ZdZ‡ fdd„Zejfdd„Zdd„ Z‡  Z	S )r=   )r;   Úlocal_tableÚinheritsc              	      sr   t t| ƒ |||¡ i | _|  d|¡| _tj�: | dd¡sPt	 
| j| j|j¡ |  |¡ |  |¡ W 5 Q R X d S )NÚ	__table__rU   F)Úsuperr=   r\   r;   r^   rf   Ú	mapperlibÚ_CONFIGURE_MUTEXr&   r   Ú	add_classrL   r   Ú_class_registryÚ_setup_inheritancera   )r[   r:   rT   r?   r@   ©Ú	__class__r    r!   r\   Ý   s     
  ÿ  ÿ
z _ImperativeMapperConfig.__init__c                 C   s   t }|  d|| j| jf|Ž¡S )Nr>   )r   r^   r   rf   ©r[   r@   Z
mapper_clsr    r    r!   r_   õ   s
    þz_ImperativeMapperConfig.mapc                 C   s¦   | j }| dd ¡}|d krŒg }|jD ]:}t|ƒ}|d kr:q$t|ƒd k	r$t|ddd�s$| |¡ q$|rœt|ƒdkr‚t 	d||f ¡‚|d }nt
|tƒrœ|j}|| _d S )Nrg   rP   TrQ   r   ú&Class %s has multiple mapped bases: %rr   )r   r&   r'   r(   r"   r3   ÚappendÚlenr   rR   rE   r   r*   rg   )r[   r@   r   rg   Úinherits_searchÚcr    r    r!   rn   ý   s>    
ÿþ  ÿþÿÿ

z*_ImperativeMapperConfig._setup_inheritance)
rX   rb   rc   rd   r\   r   Ú
EMPTY_DICTr_   rn   Ú__classcell__r    r    ro   r!   r=   Ú   s   r=   c                       s�   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zddd„Zdd„ Zdd„ Zdd„ Zejfdd„Z‡  ZS ) rS   )
r;   rf   Úpersist_selectableÚdeclared_columnsÚcolumn_copiesÚ
table_argsÚ	tablenameÚmapper_argsÚmapper_args_fnrg   c              	      s¢   |rt |ƒni | _tt| ƒ |||¡ d | _tƒ | _i | _|  	¡  |  
¡  tj�H t | j| j|j¡ |  ¡  |  ¡  |  |¡ |  |¡ |  |¡ W 5 Q R X d S r7   )Údictr;   ri   rS   r\   ry   Úsetrz   r{   Ú_setup_declared_eventsÚ_scan_attributesrj   rk   r   rl   rL   r   rm   Ú_extract_mappable_attributesÚ_extract_declared_columnsÚ_setup_tablern   ra   )r[   r:   rT   r;   r?   r@   ro   r    r!   r\   ,  s$      ÿ

z_ClassScanMapperConfig.__init__c                    sL   t ˆ jdƒr$t td¡‡ fdd„ƒ}t ˆ jdƒrHt td¡‡ fdd„ƒ}d S )	NÚ__declare_last__Úafter_configuredc                      s   ˆ j  ¡  d S r7   )r   r‡   r    ©r[   r    r!   rˆ   T  s    zG_ClassScanMapperConfig._setup_declared_events.<locals>.after_configuredÚ__declare_first__Úbefore_configuredc                      s   ˆ j  ¡  d S r7   )r   rŠ   r    r‰   r    r!   r‹   Z  s    zH_ClassScanMapperConfig._setup_declared_events.<locals>.before_configured)r3   r   r   Zlistens_forr   )r[   rˆ   r‹   r    r‰   r!   r‚   Q  s    

z-_ClassScanMapperConfig._setup_declared_eventsc                    sn   t ˆddƒ‰ˆdkr"‡fdd„}nH‡fdd„t ˆ¡D ƒ‰‡fdd„t ˆ¡D ƒ‰tƒ ‰ ‡ ‡‡‡fdd„}|S )	z‘Produce a function that checks if a class has overridden an
        attribute, taking SQLAlchemy-enabled dataclass fields into account.

        Ú__sa_dataclass_metadata_key__Nc                    s   t ˆ | ƒ|k	S r7   )r.   )ÚkeyrF   r   r    r!   Úattribute_is_overriddeni  s    zR_ClassScanMapperConfig._cls_attr_override_checker.<locals>.attribute_is_overriddenc                    s$   i | ]}ˆ |j kr|j|j ˆ  “qS r    ©ÚmetadatarJ   ©Ú.0Úf©Úsa_dataclass_metadata_keyr    r!   Ú
<dictcomp>n  s   
þ zE_ClassScanMapperConfig._cls_attr_override_checker.<locals>.<dictcomp>c                    s$   i | ]}ˆ |j kr|j|j ˆ  “qS r    r�   r‘   r”   r    r!   r–   s  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r†dS |ˆ k	r’dS dS )NFT)rG   Úfgetr&   r.   rE   r	   )r�   rF   ÚretZ	all_field)ÚabsentÚall_datacls_fieldsr   Úlocal_datacls_fieldsr    r!   rŽ   {  s.    
 ÿ)r3   r   Zdataclass_fieldsÚlocal_dataclass_fieldsr$   )r[   r   rŽ   r    )r™   rš   r   r›   r•   r!   Ú_cls_attr_override_checker^  s       ÿ
þ
þ(z1_ClassScanMapperConfig._cls_attr_override_checkerc                    s<   t ˆ ddƒ‰ˆdkr"‡ fdd„}ntƒ ‰‡ ‡‡fdd„}|S )zŠproduce a function to iterate the "attributes" of a class,
        adjusting for SQLAlchemy fields embedded in dataclass fields.

        rŒ   Nc                  3   s&   t ˆ ƒ ¡ D ]\} }| |dfV  qd S )NF)ÚvarsÚitems)rJ   rF   r   r    r!   Úlocal_attributes_for_class°  s    zM_ClassScanMapperConfig._cls_attr_resolver.<locals>.local_attributes_for_classc                  3   sj   t  ˆ ¡D ]0} ˆ| jkr
ˆ | j¡ | jt| jˆƒdfV  q
tˆ ƒ ¡ D ]\}}|ˆkrH||dfV  qHd S )NTF)r   rœ   r�   ÚaddrJ   Ú_as_dc_declaredattrrž   rŸ   )ÚfieldrJ   rF   ©r   Úfield_namesr•   r    r!   r    ·  s    
 ÿþ)r3   r�   )r[   r   r    r    r¤   r!   Ú_cls_attr_resolver¥  s      ÿz)_ClassScanMapperConfig._cls_attr_resolverc              	      sJ  | j ‰ | j}| j}d }d  }}d }|  | j ¡}g }ˆ jD ]b}	|	ˆ k	o^t|	ƒd k	o^t|	ddd� }
|  |	¡}|
s„|	ˆ k	r„|  ||¡}ni }| 	|	|
||f¡ q8|D �]€\}	}
}}| 
|¡ |ƒ D �]`\}}}|dkrøt||ˆ ƒ}|sö|
rê|rö‡ fdd„}q¾|dk�r(t||ˆ ƒ}|�s |
�r |�r ˆ j}q¾|dk�r†t||ˆ ƒ}|�s |
�rP|�r ˆ j}t|tttd ƒfƒ�svt d	¡‚|	ˆ k	�r d}q¾|
�r°t|ƒr¾t d
|	j||	ˆ f ¡ q¾q¾|	ˆ k	�rÜt|tƒ�rÌq¾�q t|tƒ�rät d¡‚nöt|ƒ�rÌ|j�r<||k�rt d|ˆ f ¡ | |ˆ ¡ ||<  ||< }tˆ ||ƒ nj|�rdtˆ |d ƒ}t|tƒ�sn|  ¡ }n
tˆ |ƒ}t|tƒ�r–|j!�r–t|j"tƒ�s–|j#}| ||< ||< t|ttfƒ�rÚ|j$d k�rÚ|j%|_$n|  &|	||¡ q¾|r¾||k�sö|| |k	r¾|||ƒ�rt'‚t|ƒ�r|  ¡ }|||< q¾q |�r4|�s4d }|| _(|| _)|| _*d S )NrP   TrQ   Ú__mapper_args__c                      s
   t ˆ jƒS r7   )r€   r§   r    r   r    r!   r     s    z?_ClassScanMapperConfig._scan_attributes.<locals>.mapper_args_fnÚ__tablename__Ú__table_args__z3__table_args__ value must be a tuple, dict, or Nonez‚Regular (i.e. not __special__) attribute '%s.%s' uses @declared_attr, but owning class %s is mapped - not applying to subclass %s.zÂMapper 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)+r   r;   r{   r�   r/   r"   r3   r¦   Ú_produce_column_copiesrs   ÚupdaterK   r¨   r©   rE   Útupler€   rW   r   ÚArgumentErrorrG   r   rI   rX   r   r   rR   rH   Ú__get__Úsetattrr.   r   r—   Z_is_internal_proxyZoriginal_propertyZ
descriptorÚdocÚ__doc__Ú_warn_for_decl_attributesr,   r|   r}   r   )r[   r;   r{   r   r|   Zinherited_table_argsr}   rŽ   Úbasesr2   Zclass_mappedr    Zlocally_collected_columnsrJ   rF   Úis_dataclassZ
check_declr˜   r    r   r!   rƒ   Ä  s   

ÿ  ÿý
þüÿû
  ÿ
  ÿ
  ÿ ÿÿ
üÿ
ÿ

ýÿ
þÿ

ÿþ ÿýÿþ
ÿ
ÿ
z'_ClassScanMapperConfig._scan_attributesc                 C   s"   t |tjƒrt d||f ¡ d S )Nz…Attribute '%s' on class %s appears to be a non-schema 'sqlalchemy.sql.column()' object; this won't be part of the declarative mapping)rE   r   ZColumnClauser   rI   )r[   r   r�   rv   r    r    r!   r²   •  s    ýÿz0_ClassScanMapperConfig._warn_for_decl_attributesc                 C   s¦   | j }| j}i }| j}|ƒ D ]„\}}}	t|tƒr|||ƒr>qq|jrPt d¡‚q||krd|krt|jph||d j	ks| 
¡  ||< }
|j|
_t|||
ƒ |
||< q|S )Nz¤Columns with foreign keys to other columns must be declared as @declared_attr callables on declarative mixin classes.  For dataclass field() objects, use a lambda:.rh   )r   r;   r{   rE   r   Zforeign_keysr   rR   rJ   rv   Z_copyÚ_creation_orderr¯   )r[   Zattributes_for_classrŽ   r   r;   Zlocally_collected_attributesr{   rJ   rF   r´   Zcopy_r    r    r!   rª   ž  s,    

ÿÿþ
z-_ClassScanMapperConfig._produce_column_copiesc                 C   s@  | j }| j}| j}t|ddd�}t|ƒD �]}|dkr8q(|| }t|ƒrj|jr^t d| j  ¡ t	||ƒ}n4t
|tƒrž|j|k	rž|j|kržt|jƒ}t|||ƒ t
|tƒrØt|ƒdkrØt
|d ttfƒrØt d| ¡ q(nZt
|ttfƒ�s| d	¡s(| |¡ |  |||¡ |s(t|||ƒ q(n|d
k�r2t d¡‚|||< q(d S )NrP   TrQ   )rh   r¨   r§   z�Use of @declared_attr.cascading only applies to Declarative 'mixin' and 'abstract' classes.  Currently, this flag is ignored on mapped class %sr   r   z‘Ignoring declarative-like tuple value of attribute '%s': possibly a copy-and-paste error with a comma accidentally placed at the end of the line?Ú__r�   zdAttribute name 'metadata' is reserved for the MetaData instance when using a declarative base class.)r   r;   rM   r3   ÚlistrG   rH   r   rI   r.   rE   r
   r*   r�   r   r¯   r¬   rt   r   r   Ú
startswithÚpopr²   r   rR   )r[   r   r;   Ú	our_stuffZlate_mappedÚkr]   r    r    r!   r„   ¿  sh      ÿýÿÿþý
ÿ
þýþÿ


ÿz3_ClassScanMapperConfig._extract_mappable_attributesc              
      s   | j ‰ tjˆ ‡ fdd„d� | j}t t¡}tˆ  ¡ ƒD ]¤\}}t	|t
tfƒrž|jD ]F}t	|tƒrT|jd krTt||ƒ t	|tƒs�||j  |¡ | |¡ qTq8t	|tƒr8t||ƒ ||j  |¡ | |¡ ||jkr8ˆ |= q8| ¡ D ]4\}}t|ƒdkræt d| j|d t|ƒ¡f ¡ qæd S )Nc                    s
   ˆ |  j S r7   ©rµ   ©r�   ©rº   r    r!   Ú<lambda>	  ó    zB_ClassScanMapperConfig._extract_declared_columns.<locals>.<lambda>r½   r   zzOn class %r, Column object %r named directly multiple times, only one will be used: %s. Consider using orm.synonym insteadz, )rM   r   Zsort_dictionaryrz   ÚcollectionsÚdefaultdictr�   r·   rŸ   rE   r   r   Úcolumnsr   r?   Ú_undefer_column_namerJ   r¡   r�   rt   rI   rL   ÚjoinÚsorted)r[   rz   Zname_to_prop_keyr�   rv   ÚcolrJ   Úkeysr    r¾   r!   r…     s8     
ÿ







üÿz0_ClassScanMapperConfig._extract_declared_columnsNc                 C   sn  | j }| j}| j}| j}| j}t |¡}t|dd„ d� }| _d|k�r$|d k�r$t|dƒrjt	 
|j¡}nt}|d k	�rddi  }	}
|rÊt|tƒr–|}
n4t|tƒrÊt|d tƒrÆ|dd… |d  }	}
n|}	| d	¡}|rà||
d
< | d¡}|röd|
d< |  d|||  |¡ft|ƒt|	ƒ ž|
Ž¡}n@|d k�r4|j}|�rd|D ]$}|j |¡�s>t d|j ¡‚�q>|| _d S )Nc                 S   s   | j S r7   r¼   )rv   r    r    r!   r¿   7  rÀ   z5_ClassScanMapperConfig._setup_table.<locals>.<lambda>r½   rh   Ú__table_cls__r    éÿÿÿÿr   Z__autoload_with__Úautoload_withZ__autoload__TÚautoloadz8Can't add additional column %r when specifying __table__)r   r}   r|   r;   rz   r   r5   rÆ   r4   r   Úunbound_method_to_callablerÉ   r   rE   r€   r¬   r&   r^   Ú_metadata_for_clsrh   rv   Zcontains_columnr   r­   r�   rf   )r[   r?   r   r}   r|   r;   rz   r6   Z	table_clsÚargsZtable_kwrË   rÌ   rv   r    r    r!   r†   -  sf    
 ÿ






þýüþ

ÿÿz#_ClassScanMapperConfig._setup_tablec                 C   s    t | jdƒr| jjS |jjS d S )Nr�   )r4   r   r�   r:   )r[   r6   r    r    r!   rÎ   i  s    z(_ClassScanMapperConfig._metadata_for_clsc                 C   sª  | j }| j}| j}| j}| dd ¡}|d kr¦g }|jD ]B}t|ƒ}|d krLq6t|ƒd k	r6t|ddd�s6||kr6| 	|¡ q6|r¶t
|ƒdkrœt d||f ¡‚|d }nt|tƒr¶|j}|| _|d krè| jd krèt|dƒsèt d	| ¡‚n¾| j�r¦t| jƒ}	|	j }
|	j}|d k�r¦|�r t d
¡‚|D ]€}|j|
jk�rh|
j|j |k�rL�q$t d|||
j|j f ¡‚|j�rzt d¡‚|
 |¡ |d k	�r$||
k	�r$| |¡ �q$d S )Nrg   rP   TrQ   r   rr   r   Z__no_table__zwClass %r does not have a __table__ or __tablename__ specified and does not inherit from an existing table-mapped class.z?Can't place __table_args__ on an inherited class with no table.z;Column '%s' on class %s conflicts with existing column '%s'zDCan't place primary key columns on an inherited class with no table.)rf   r   r|   rz   r&   r'   r(   r"   r3   rs   rt   r   rR   rE   r   r*   rg   ry   r­   rJ   rv   Zprimary_keyÚappend_columnZ_refresh_for_new_column)r[   r@   r?   r   r|   rz   rg   ru   rv   Úinherited_mapperÚinherited_tableZinherited_persist_selectabler    r    r!   rn   o  s”    
ÿþ  ÿþÿÿ

ÿþýþÿ

ÿþÿÿ
ÿþz)_ClassScanMapperConfig._setup_inheritancec                    s¨  | j }| jr|  ¡ }ni }|r(| |¡ d|krFt|ƒ}| |d ¡ dD ]&}||krJ|| }| j ||¡||< qJd|kr®|d }t|tƒr’|j}|| j	k	r®t
 d|d  ¡‚| j	r¾| j	|d< | j	�rŽ| dd¡�sŽt| j	ƒ‰ ˆ j}d|k�r2t‡ fdd	„|jD ƒƒ ˆ j�pd
¡ |d< }| dd	„ | jD ƒ¡ t| ¡ ƒD ]N\}}	t|	tjƒ�sX�q>|ˆ jk�r>ˆ j| }
t|
tƒ�r>|	g|
j ||< �q>| ¡ }||d< || _d S )NrM   )Zversion_id_colZpolymorphic_onrg   z:mapper inherits argument given for non-inheriting class %sZconcreteFÚexclude_propertiesc                    s   g | ]}|ˆ j kr|j‘qS r    )Z_columntopropertyr�   ©r’   rv   ©rÑ   r    r!   Ú
<listcomp>ï  s   
þzD_ClassScanMapperConfig._prepare_mapper_arguments.<locals>.<listcomp>r    c                 S   s   g | ]
}|j ‘qS r    r½   rÔ   r    r    r!   rÖ   ö  s     )rM   r   r«   r€   r{   r&   rE   r   r*   rg   r   rR   r"   rf   r�   rv   ÚunionrÓ   Údifference_updaterz   r·   rŸ   r   ZColumnElementZ_propsr   rÃ   Úcopyr~   )r[   r@   rM   r~   r»   ÚvZinherits_argrÒ   rÓ   rÇ   ÚpZresult_mapper_argsr    rÕ   r!   Ú_prepare_mapper_argumentsÁ  sb    



ÿÿ



þÿ
úÿ

z0_ClassScanMapperConfig._prepare_mapper_argumentsc                 C   sF   |   |¡ t| jdƒr&t | jj¡}nt}|  d|| j| jf| j	Ž¡S )NÚ__mapper_cls__r>   )
rÜ   r4   r   r   rÍ   rÝ   r   r^   rf   r~   rq   r    r    r!   r_     s    
ÿþz_ClassScanMapperConfig.map)N)rX   rb   rc   rd   r\   r‚   r�   r¦   rƒ   r²   rª   r„   r…   r†   rÎ   rn   rÜ   r   rw   r_   rx   r    r    ro   r!   rS     s    %G R	!E)
<RKrS   c                 C   s6   t jj}| | }t|ƒr.t||jƒs.| |¡S |S d S r7   )r   rB   rC   ÚcallablerE   rD   )Zfield_metadatar•   Zdecl_apirF   r    r    r!   r¢     s
    
r¢   c                       sŠ   e Zd Ze ¡ Zdd„ Zedd„ ƒZej	dd„ ƒZe
dd„ ƒZe
dd	„ ƒZe
d
d„ ƒZe
dd„ ƒZe
ddd„ƒZejf‡ fdd„	Z‡  ZS )r   c                 C   s   d S r7   r    r`   r    r    r!   ra   +  s    z$_DeferredMapperConfig._early_mappingc                 C   s   |   ¡ S r7   )Ú_clsr‰   r    r    r!   r   .  s    z_DeferredMapperConfig.clsc                 C   s    t  || j¡| _| | j| j< d S r7   )ÚweakrefÚrefÚ_remove_config_clsrß   Ú_configs)r[   r*   r    r    r!   r   2  s    c                 C   s   | j  |d ¡ d S r7   )rã   r¹   )r   rá   r    r    r!   râ   7  s    z(_DeferredMapperConfig._remove_config_clsc                 C   s   t |tƒot |¡| jkS r7   )rE   rW   rà   rá   rã   ©r   r*   r    r    r!   r   ;  s    z_DeferredMapperConfig.has_clsc                 C   s.   t |dƒr| ¡  tj|dt |¡ d�‚d S )NÚ_sa_raise_deferred_configzOClass %s has a deferred mapping on it.  It is not yet usable as a mapped class.)Úmsg)r4   rå   Úorm_excZUnmappedClassErrorZ_safe_cls_namerä   r    r    r!   Úraise_unmapped_for_cls@  s    
ÿþz,_DeferredMapperConfig.raise_unmapped_for_clsc                 C   s   | j t |¡ S r7   )rã   rà   rá   rä   r    r    r!   r   K  s    z$_DeferredMapperConfig.config_for_clsTc                    sv   ‡fdd„dd„ | j  ¡ D ƒD ƒ}|s*|S tdd„ |D ƒƒ‰ g }ˆ D ] ‰| ‡ ‡fdd„ˆjD ƒ¡ qDtt ||¡ƒS )Nc                    s&   g | ]\}}|d k	rt |ˆ ƒr|‘qS r7   )r-   )r’   ÚmrT   )Úbase_clsr    r!   rÖ   Q  s    
þz:_DeferredMapperConfig.classes_for_base.<locals>.<listcomp>c                 S   s   g | ]}||j f‘qS r    r   ©r’   ré   r    r    r!   rÖ   S  s     c                 s   s   | ]}|j |fV  qd S r7   r   rë   r    r    r!   Ú	<genexpr>Z  s     z9_DeferredMapperConfig.classes_for_base.<locals>.<genexpr>c                 3   s&   | ]}|ˆ krˆ | ˆ ˆ fV  qd S r7   r    )r’   rê   )Úall_m_by_clsÚm_clsr    r!   rì   ^  s   þ)rã   Úvaluesr€   Úextendr'   r·   r   Úsort)r   rê   rñ   Úclasses_for_baseZtuplesr    )rí   rê   rî   r!   rò   O  s    
þþ
z&_DeferredMapperConfig.classes_for_basec                    s    | j  | jd ¡ tt| ƒ |¡S r7   )rã   r¹   rß   ri   r   r_   r`   ro   r    r!   r_   e  s    z_DeferredMapperConfig.map)T)rX   rb   rc   r   rY   rã   ra   Úpropertyr   Úsetterre   râ   r   rè   r   rò   rw   r_   rx   r    r    ro   r!   r   (  s"   






r   c                 C   s  d| j krôt|tƒr>t||ƒ | jj|dd� | j ||¡ n´t|tƒr’|j	D ]2}t|tƒrN|j
dkrNt||ƒ | jj|dd� qN| j ||¡ n`t|tƒr¬| j ||¡ nFt|tƒrÚ|j|krÚt|jƒ}| j ||¡ nt | ||¡ | j ¡  nt | ||¡ dS )z¹add an attribute to an existing declarative class.

    This runs through the logic to determine MapperProperty,
    adds it to the Mapper, adds a column to the mapped Table, etc.

    r>   T)Zreplace_existingN)r%   rE   r   rÄ   rh   rÐ   r>   Zadd_propertyr   rÃ   r?   r   r
   r�   r   rW   Ú__setattr__Ú_expire_memoizations)r   r�   r]   rÇ   r    r    r!   Ú_add_attributej  s&    







r÷   c                 C   sj   d| j krZ|| j krZ| jjsZ| j | }t|ttttfƒrBtdƒ‚qft	 
| |¡ | j ¡  nt	 
| |¡ d S )Nr>   z<Can't un-map individual mapped attributes on a mapped class.)r%   r>   Z_dispose_calledrE   r   r   r   r
   ÚNotImplementedErrorrW   Ú__delattr__rö   )r   r�   r]   r    r    r!   Ú_del_attribute‹  s"    ÿþý
 
ÿÿrú   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)rW   r4   Ú	TypeErrorrX   r¯   )r[   ÚkwargsrT   r»   r    r    r!   Ú_declarative_constructor   s    

ÿrý   r\   c                 C   s$   |j d kr| |_ |jd kr | |_d S r7   )r�   rJ   )r�   Úcolumnr    r    r!   rÄ   ¶  s    

rÄ   )F)8r±   Ú
__future__r   rÁ   rà   Zsqlalchemy.ormr   r   Ú r   r   rç   r   rj   r	   r
   r2   r   r   Zdescriptor_propsr   r   Z
interfacesr   r   rM   r   r   r   r   Úsqlr   Z
sql.schemar   r   r   r"   r(   r3   r)   r<   rA   Zpreload_modulerG   rK   r$   r8   r=   rS   r¢   r   r÷   rú   rý   rX   rÄ   r    r    r    r!   Ú<module>   sf   
%
@D      
B!