o
    =a@                     @   sJ  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& 	$d8d%ed&ed'e'd(eee&j(  fd)d*Z)d%ed&ed+e*d,ed-ee&j( d(d.fd/d0Z+d%ed&ed1ed-ee&j( d(d.f
d2d3Z,d%ed&ed1ed-ee&j( d(d.f
d4d5Z-d%ed&ed(d.fd6d7Z.d.S )9    )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 u rd S | jdrd S t ||}|d ur)|s't| || |S g }| jjsB|j	
 D ]\}}t| |||| q4n#t | jjD ]}t|trXt| ||| qIt|trdt| ||| qIt| | |sst| || t || |S )Nbuiltins)r$   info_for_clsfullname
startswithget_mapped_attributesr!    re_apply_declarative_assignmentsdefsbodyr#   items_scan_symbol_table_entryflatten_typechecking
isinstancer   !_scan_declarative_assignment_stmtr    _scan_declarative_decorator_stmt_scan_for_mapped_basesadd_additional_orm_attributesset_mapped_attributes)r%   r&   r'   infomapped_attributessym_namesymstmt r?   T/var/www/html/gps/gps/lib/python3.10/site-packages/sqlalchemy/ext/mypy/decl_class.py,scan_declarative_assignments_and_apply_types.   sB   




rA   namevalue
attributesNc              	   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v r4|jr1t |jd }nWd}nT|tju r|js?d}nIt |jd }	t|	trN|	j}	t|	ttfr||	j|	}
|
durt|
jtrt|
jtjr|tt||
jg t g}nt|d|
jj| |rd}t|||| j|  ttj}|dur|jdusJ | tj!||jj"|jj#|| j$d dS dS )zaExtract mapping information from a SymbolTableNode that's in the
    type.names dictionary.

    NFr   T4Column type should be a TypeEngine subclass not '{}'zCan'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>]rB   linecolumntypr:   )%r   typer4   r   r#   type_id_for_named_nodeMAPPEDRELATIONSHIPCOMPOSITE_PROPERTYMAPPER_PROPERTYSYNONYM_PROPERTYCOLUMN_PROPERTYargsCOLUMNr   r   lookup_qualifiedrB   nodehas_base_type_id
TYPEENGINEr   r"   #extract_python_type_from_typeenginer   r$   failformatr+   r   r   special_formappendSQLAlchemyAttributerG   rH   r:   )r%   r&   rB   rC   rD   
value_typeleft_hand_explicit_typetype_iderrtypeengine_argr=   msgr?   r?   r@   r2   n   sv   



	

r2   r>   c              	   C   s
  |j D ]}t|tttfrt|tju r nqdS | jj	
|}d}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v rY|jrYt|jd }nE|tju r|jr|jd }	t|	tr||	j|	}
|
durt|
jtrt|
jtjrt t!"||
jg t# g}nt$%|d&|
jj'| |du rd}t$%||&|j(j| t)t*j+}t|j(j}|j(|_t|trtt$,||}|-d|g|j_t$.t/|jj0|jj	}t1|g|}|jj|_|2t$j3|j|j4|j5|| j6d || 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   rE   zCan'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>]__sa_MappedrF   )7
decoratorsr4   r   r   r   r#   rK   DECLARED_ATTRr/   r0   indexfuncrJ   r   ret_typer   type_id_for_unbound_typerL   rM   rN   rO   rP   rQ   rR   r   rS   rT   rB   rU   r   rV   rW   r   r"   rX   r   r$   rY   rZ   r+   varr   r   r[   unbound_to_instance
named_typeexpr_to_mapped_constructorr	   	argumentsr   r\   r]   rG   rH   r:   )r%   r&   r>   rD   dec	dec_indexr_   	func_typer`   rb   r=   rc   	left_nodervaluenew_stmtr?   r?   r@   r6      s   





	




	r6   c              	   C   sp  |j d }t|tsdS | jj|j}|dusJ |j}t|tr$dS ||ju s+J t|t	s2J |jdkrG|
|jdu rEt| j dS |jdkrSt| j n1|jdr[dS |jdkrt|jtsnt|d| n|jjD ]}t|ttfrt| ||| qrd}d}	|js|jdu rt|jtr|j}	|jjd	kr|d	| }
|
dur|
jdurt|
jtju rt|jjd }	|j}n!t|j}t|trt|jtju rt|jd }	|}n|}	d}t|jtr|dur|	}n$t|jt rt|jj!t"rt#$||||	|jj!}|du rdS ndS |dusJ |%tj&|j|j'|j(|| jd
 t)||||	| dS )zZExtract mapping information from an assignment statement in a
    declarative class.

    r   N__abstract__T__tablename_____mypy_mapped_attrsz+_mypy_mapped_attrs is expected to be a listMappedrF   )*lvaluesr4   r   r:   r#   getrB   rU   r   r   
parse_boolrt   r$   set_is_baseset_has_tabler,   r
   rY   r1   r   r!   apply_mypy_mapped_attris_inferredrJ   r   rT   rK   rL   r   rR   r   r   r   calleer   r"   #infer_type_from_right_hand_nameexprr\   r]   rG   rH   apply_type_to_mapped_statement)r%   r&   r>   rD   lvaluer=   rU   itemleft_hand_mapped_typer_   
mapped_sym	node_typepython_type_for_typer?   r?   r@   r5   W  s   











r5   c                 C   sN   t | |}|du rdS |jdd D ]}|jdrqt|j|dd qdS )zGiven 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,   rA   defn)r%   r&   r:   	base_infor?   r?   r@   r7     s   r7   )F)/typingr   r   r   
mypy.nodesr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   mypy.pluginr   
mypy.typesr   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   boolr]   rA   strr2   r6   r5   r7   r?   r?   r?   r@   <module>   s   
@
Z
 
 