o
    gC                     @  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' d d$l$m(Z( 	%dCdDd.d/Z)dEd7d8Z*dFd;d<Z+dGd>d?Z,dHd@dAZ-dBS )I    )annotations)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clsr   apir   is_mixin_scanboolreturn(Optional[List[util.SQLAlchemyAttribute]]c                 C  s   t | |}|d u rd S | jdrd S t ||}t | |d ur.|s,t| || |S g }| jj	sG|j
 D ]\}}t| |||| q9n#t | jj	D ]}t|tr]t| ||| qNt|trit| ||| qNt| | |sxt| || t || |S )Nbuiltins)r%   info_for_clsfullname
startswithget_mapped_attributesestablish_as_sqlalchemyr"    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 rC   X/var/www/html/api-tag/env/lib/python3.10/site-packages/sqlalchemy/ext/mypy/decl_class.py,scan_declarative_assignments_and_apply_types0   sD   





rE   namestrvaluer   
attributesList[util.SQLAlchemyAttribute]Nonec              	   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>]rF   linecolumntypr>   )%r   typer8   r   r$   type_id_for_named_nodeMAPPEDRELATIONSHIPCOMPOSITE_PROPERTYMAPPER_PROPERTYSYNONYM_PROPERTYCOLUMN_PROPERTYargsCOLUMNr   r   lookup_qualifiedrF   nodehas_base_type_id
TYPEENGINEr    r#   #extract_python_type_from_typeenginer   r%   failformatr.   r   r   special_formappendSQLAlchemyAttributerN   rO   r>   )r&   r'   rF   rH   rI   
value_typeleft_hand_explicit_typetype_iderrtypeengine_argrA   msgrC   rC   rD   r6   r   sv   



	

r6   rB   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rMt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rft|
| |}ndS |tjtjtjtjtjtj hv r|
j!rt"|
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/||}|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   rL   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>]rM   ):
decoratorsr8   r   r   r   r$   rR   DECLARED_ATTRr3   r4   indexr%   name_is_dunderrF   r   r   rb   varr\   r   r   rQ   funcr   ret_typer   type_id_for_unbound_typerS   rT   rU   rV   rW   rX   rY   r   rZ   r[   r   r]   r^   r    r#   r_   r   r`   ra   r.   unbound_to_instance
named_typeNAMED_TYPE_SQLA_MAPPEDexpr_to_mapped_constructorr
   	argumentsrc   rd   rN   rO   r>   )r&   r'   rB   rI   dec	dec_indexrf   any_	left_nodenew_stmt	func_typerg   ri   rA   rj   rvaluerC   rC   rD   r:      s   




	

	




	r:   r   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MappedrM   )*lvaluesr8   r   r>   r$   getrF   r\   r   r   
parse_boolr~   r%   set_is_baseset_has_tabler/   r   r`   r5   r   r"   apply_mypy_mapped_attris_inferredrQ   r   r[   rR   rS   r   rY   r   r   r   calleer   r#   #infer_type_from_right_hand_nameexprrc   rd   rN   rO   apply_type_to_mapped_statement)r&   r'   rB   rI   lvaluerA   r\   itemleft_hand_mapped_typerf   
mapped_sym	node_typepython_type_for_typerC   rC   rD   r9   g  s   












r9   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/   rE   defn)r&   r'   r>   	base_inforC   rC   rD   r;     s   r;   N)F)r&   r   r'   r   r(   r)   r*   r+   )r&   r   r'   r   rF   rG   rH   r   rI   rJ   r*   rK   )
r&   r   r'   r   rB   r	   rI   rJ   r*   rK   )
r&   r   r'   r   rB   r   rI   rJ   r*   rK   )r&   r   r'   r   r*   rK   ).
__future__r   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%   rE   r6   r:   r9   r;   rC   rC   rC   rD   <module>   sV   
B
Y 
 