U
    ÌZj¿C  ã                   @   s$  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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& d4eee'eee&j(  d%œd&d'„Z)eee*eee&j( d(d)œd*d+„Z+eeeee&j( d(d,œd-d.„Z,eeeee&j( d(d,œd/d0„Z-eed(d1œd2d3„Z.d(S )5é    )ÚList)ÚOptional)ÚUnion)ÚAssignmentStmt)ÚCallExpr)ÚClassDef)Ú	Decorator)Ú
LambdaExpr)ÚListExpr)Ú
MemberExpr)ÚNameExpr)ÚPlaceholderNode)ÚRefExpr)ÚStrExpr)Ú
SymbolNode)ÚSymbolTableNode)ÚTempNode)ÚTypeInfo)ÚVar)ÚSemanticAnalyzerPluginInterface)ÚAnyType)ÚCallableType)Úget_proper_type)ÚInstance)ÚNoneType)Ú
ProperType)ÚType)Ú	TypeOfAny)ÚUnboundType)Ú	UnionTypeé   )Úapply)Úinfer)Únames)ÚutilF)ÚclsÚapiÚis_mixin_scanÚreturnc                 C   s   t  | |¡}|d krd S | j d¡r(d S t  ||¡}t  |¡ |d k	r\|sXt | ||¡ |S g }| jj	sŽ|j
 ¡ D ]\}}t| ||||ƒ qrnFt  | jj	¡D ]6}t|tƒrºt| |||ƒ qœt|tƒrœt| |||ƒ qœt| |ƒ |sðt | ||¡ t  ||¡ |S )NÚbuiltins)r$   Úinfo_for_clsÚfullnameÚ
startswithZget_mapped_attributesZestablish_as_sqlalchemyr!   Z re_apply_declarative_assignmentsÚdefsÚbodyr#   ÚitemsÚ_scan_symbol_table_entryZflatten_typecheckingÚ
isinstancer   Ú!_scan_declarative_assignment_stmtr   Ú _scan_declarative_decorator_stmtÚ_scan_for_mapped_basesZadd_additional_orm_attributesZset_mapped_attributes)r%   r&   r'   ÚinfoZmapped_attributesZsym_nameÚsymÚstmt© r8   úa/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/sqlalchemy/ext/mypy/decl_class.pyÚ,scan_declarative_assignments_and_apply_types.   sT    
þ
    ÿ
   ÿ
   ÿ
r:   N)r%   r&   ÚnameÚvalueÚ
attributesr(   c              	   C   sˆ  t |jƒ}t|tƒsdS d}t |j¡}d}|tjtjtjtj	tj
tjhkrh|jrbt |jd ƒ}nd}n²|tjk�r|js€d}nšt |jd ƒ}	t|	tƒrž|	j}	t|	ttfƒ�r| |	j|	¡}
|
dk	�rt|
jtƒ�rt |
jtj¡�rtt ||
jg ¡tƒ gƒ}nt |d |
jj¡|¡ |�rFd}t || || j¡| ¡ ttjƒ}|dk	�r„|jdk	�s`t ‚| !tj"||jj#|jj$|| j%d�¡ dS )zaExtract mapping information from a SymbolTableNode that's in the
    type.names dictionary.

    NFr   Tú4Column type should be a TypeEngine subclass not '{}'zØCan't infer type from attribute {} on class {}. please specify a return type from this function that is one of: Mapped[<python type>], relationship[<target class>], Column[<TypeEngine>], MapperProperty[<python type>]©r;   ÚlineÚcolumnÚtypr5   )&r   Útyper1   r   r#   Útype_id_for_named_nodeÚMAPPEDÚRELATIONSHIPÚCOMPOSITE_PROPERTYÚMAPPER_PROPERTYÚSYNONYM_PROPERTYÚCOLUMN_PROPERTYÚargsÚCOLUMNr   r   Úlookup_qualifiedr;   ÚnodeÚhas_base_type_idÚ
TYPEENGINEr   r"   Ú#extract_python_type_from_typeenginer   r$   ÚfailÚformatr+   r   r   Úspecial_formÚAssertionErrorÚappendÚSQLAlchemyAttributer@   rA   r5   )r%   r&   r;   r<   r=   Z
value_typeÚleft_hand_explicit_typeÚtype_idÚerrÚtypeengine_argr6   Úmsgr8   r8   r9   r0   q   sz    

úÿ
  ÿüÿ	ÿüÿ

ûÿr0   )r%   r&   r7   r=   r(   c              	   C   sv  |j D ](}t|tttfƒrt |¡tjkr q4qdS | jj	 
|¡}d}t |j¡ršttjƒ}t|jjƒ}|j|_t|gt|ƒƒ}	|jj|	_|	| jj	|< dS t|jjtƒ�r¢|jjj}
t|
tƒrÎt |
| |¡}ndS |tjtjtjtjtjtj hk�r|
j!�rt"|
j!d ƒ}n–|tj#k�r¢|
j!�r¢|
j!d }t|tƒ�r¢| $|j|¡}|dk	�r¢t|jt%ƒ�r¢t &|jtj'¡�rŠt(t) *||jg ¡t+ƒ gƒ}nt ,|d -|jj.¡|
¡ |dk�rÒd}t ,|| -|jj¡|¡ ttjƒ}t|jjƒ}|j|_t|tƒ�rt"t /||¡ƒ}| 0tj1|g¡|j_t 2t3|jj4|jj	ƒ¡}t|g|ƒ}	|jj|	_| 5tj6|j|j7|j8|| j9d�¡ |	| jj	|< dS )a°  Extract mapping information from a @declared_attr in a declarative
    class.

    E.g.::

        @reg.mapped
        class MyClass:
            # ...

            @declared_attr
            def updated_at(cls) -> Column[DateTime]:
                return Column(DateTime)

    Will resolve in mypy as::

        @reg.mapped
        class MyClass:
            # ...

            updated_at: Mapped[Optional[datetime.datetime]]

    Nr   r>   zàCan't infer type from @declared_attr on function '{}';  please specify a return type from this function that is one of: Mapped[<python type>], relationship[<target class>], Column[<TypeEngine>], MapperProperty[<python type>]r?   ):Z
decoratorsr1   r   r   r   r#   rD   ZDECLARED_ATTRr-   r.   Úindexr$   Zname_is_dunderr;   r   r   rT   ÚvarrN   r   r   rC   Úfuncr   Zret_typer   Ztype_id_for_unbound_typerE   rF   rG   rH   rI   rJ   rK   r   rL   rM   r   rO   rP   r   r"   rQ   r   rR   rS   r+   Zunbound_to_instanceZ
named_typeZNAMED_TYPE_SQLA_MAPPEDZexpr_to_mapped_constructorr	   Ú	argumentsrV   rW   r@   rA   r5   )r%   r&   r7   r=   ÚdecZ	dec_indexrX   Zany_Z	left_nodeZnew_stmtZ	func_typerY   r[   r6   r\   Úrvaluer8   r8   r9   r3   Ë   s®    
ÿþ



úÿÿ
ö
  ÿüÿ	ÿü
ÿ

ÿ ÿÿ
ûÿ	r3   c              	   C   sˆ  |j d }t|tƒsdS | jj |j¡}|dk	s4t‚|j}t|t	ƒrHdS ||jksVt‚t|t
ƒsdt‚|jdkrŽ| |j¡dkrŠt | j¡ dS |jdkr¦t | j¡ nd|j d¡r¶dS |jdk�r
t|jtƒsÞt |d|¡ n,|jjD ]"}t|ttfƒræt | |||¡ qæd}d}	|j�s&|jdk�r–t|jtƒ�rÜ|j}	|jjd	k�rÜ| d	| ¡}
|
dk	�rÜ|
jdk	�rÜt |
j¡tjk�rÜt|jjd ƒ}	|j}nFt|jƒ}t|tƒ�rÔt |j¡tjk�rÔt|jd ƒ}	|}n|}	d}t|jt ƒ�rú|dk	�rú|	}nHt|jt!ƒ�r>t|jj"t#ƒ�r>t$ %||||	|jj"¡}|dk�rBdS ndS |dk	�sPt‚| &tj'|j|j(|j)|| jd
�¡ t *||||	|¡ dS )zZExtract mapping information from an assignment statement in a
    declarative class.

    r   NZ__abstract__TZ__tablename__Ú__Z_mypy_mapped_attrsz+_mypy_mapped_attrs is expected to be a listZMappedr?   )+Zlvaluesr1   r   r5   r#   Úgetr;   rU   rN   r   r   Z
parse_boolrb   r$   Zset_is_baseZset_has_tabler,   r
   rR   r/   r   r!   Zapply_mypy_mapped_attrZis_inferredrC   r   rM   rD   rE   r   rK   r   r   r   Zcalleer   r"   Z#infer_type_from_right_hand_nameexprrV   rW   r@   rA   Zapply_type_to_mapped_statement)r%   r&   r7   r=   Zlvaluer6   rN   ÚitemZleft_hand_mapped_typerX   Z
mapped_symZ	node_typeZpython_type_for_typer8   r8   r9   r2   g  sª    





ÿþ
ÿý
ÿ
ÿþ ÿ    ÿ
ûÿ
ûr2   )r%   r&   r(   c                 C   sN   t  | |¡}|dkrdS |jdd… D ]"}|j d¡r8q&t|j|dd� q&dS )zèGiven a class, iterate through its superclass hierarchy to find
    all other classes that are considered as ORM-significant.

    Locates non-mapped mixins and scans them for mapped attributes to be
    applied to subclasses.

    Nr    éÿÿÿÿr)   T)r'   )r$   r*   Úmror+   r,   r:   Zdefn)r%   r&   r5   Z	base_infor8   r8   r9   r4   ê  s      ÿr4   )F)/Útypingr   r   r   Z
mypy.nodesr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   Zmypy.pluginr   Z
mypy.typesr   r   r   r   r   r   r   r   r   r   Ú r!   r"   r#   r$   ÚboolrW   r:   Ústrr0   r3   r2   r4   r8   r8   r8   r9   Ú<module>   s‚    ýüDú[û û ý