o
    g_)                     @  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' dAd,d-Z(dBd.d/Z)dCd7d8Z*dBd9d:Z+dDd>d?Z,d@S )E    )annotations)List)Optional)Union)ARG_NAMED_OPT)Argument)AssignmentStmt)CallExpr)ClassDef)MDEF)
MemberExpr)NameExpr)RefExpr)StrExpr)SymbolTableNode)TempNode)TypeInfo)Var)SemanticAnalyzerPluginInterface)add_method_to_class)AnyType)get_proper_type)Instance)NoneTyp)
ProperType)	TypeOfAny)UnboundType)	UnionType   )infer)util)expr_to_mapped_constructor)NAMED_TYPE_SQLA_MAPPEDclsr
   apir   itemUnion[NameExpr, StrExpr]
attributesList[util.SQLAlchemyAttribute]returnNonec              	   C  s   t |tr	|j}nt |tr|j}nd S | jjD ]}t |tr1t |jd tr1|jd j|kr1 nqt	
|d| |  d S |jd u rLt	
|d| d S t|j}t |tttfs[J |t	j||j|j|| jd t|||jd |d  d S )Nr   zCan't find mapped attribute zBStatement linked from _mypy_mapped_attrs has no typing information)namelinecolumntypinfo)
isinstancer   r+   r   valuedefsbodyr   lvaluesr    failtyper   r   r   r   appendSQLAlchemyAttributer,   r-   r/   apply_type_to_mapped_statement)r#   r$   r%   r'   r+   stmtleft_hand_explicit_type r<   [/var/www/html/ecg_monitoring/venv/lib/python3.10/site-packages/sqlalchemy/ext/mypy/apply.pyapply_mypy_mapped_attr-   sL   





r>   c           
   	   C  s  dd |D }d}| j jD ]}t|trt|jd tr|jd j|v rt|jd jtr|jd j}||jd j j	}t
|j	}t|trt|tst|jtrt|jjtrt|jjjtr|jjjjdur|jjjjjtkr|jjjdkrt|jjd trt|jjd jtrt|||||jjd j}	|	durt|	ts|	}|||jd j _	d}t|j	tr|j	j	jtkr|dusJ |t|g|_	q|rt| j| dS dS )zlFor multiple class passes, re-apply our left-hand side types as mypy
    seems to reset them in place.

    c                 S  s   i | ]}|j |qS r<   )r+   .0attrr<   r<   r=   
<dictcomp>k   s    z4re_apply_declarative_assignments.<locals>.<dictcomp>Fr   N_empty_constructorT)r2   r3   r0   r   r4   r   r+   noder   r6   r   r   rvaluer	   calleer   exprfullnamer"   argsr   r   #infer_type_from_right_hand_nameexprr   
named_typer    set_mapped_attributesr/   )
r#   r$   r'   mapped_attr_lookupupdate_cls_metadatar:   	left_nodepython_type_for_typeleft_node_proper_typenew_python_type_for_typer<   r<   r=    re_apply_declarative_assignmentsb   s|   	





rS   r:   r   lvaluer   r;   Optional[ProperType]rP   c                 C  s   |j }t|ts
J |durd|_| t|g|_nd|_| t|du r*ttj	gn|g|_t
|j|_|jdurC|durE||_dS dS dS )a  Apply the Mapped[<type>] annotation and right hand object to a
    declarative assignment statement.

    This converts a Python declarative class statement such as::

        class User(Base):
            # ...

            attrname = Column(Integer)

    To one that describes the final Python behavior to Mypy::

    ... format: off

        class User(Base):
            # ...

            attrname : Mapped[Optional[int]] = <meaningless temp node>

    ... format: on

    NF)rD   r0   r   is_inferred_defrK   r"   r6   r   r   special_formr!   rE   )r$   r:   rT   r;   rP   rO   r<   r<   r=   r9      s$   
r9   c              	   C  s$  t | |}|du rdS t |}d|jvrt|stdd |D }|jdd D ] }d|jvr.q&t ||}|du r9q&|D ]
}||j|j	 q;q&g }	|
 D ]\}
}|du rZttj}|	tt|
||t|td qMt|| d|	t  d	|jvrt |rt|| d
d	 |st|| dd dS dS )zCApply __init__, __table__ and other attributes to the mapped class.N__init__c                 S  s   i | ]}|j |jqS r<   )r+   r6   r?   r<   r<   r=   rB     s    z1add_additional_orm_attributes.<locals>.<dictcomp>r   
sqlalchemy)variabletype_annotationinitializerkind	__table__zsqlalchemy.sql.schema.Tablezsqlalchemy.orm.mapper.Mapper
__mapper__)r    info_for_clsget_is_basenamesmrometadataget_mapped_attributes
setdefaultr+   r6   itemsr   r   rW   r7   r   r   r   r   r   r   get_has_table _apply_placeholder_attr_to_class)r#   r$   r'   r/   is_basemapped_attr_namesbasebase_cls_attributesrA   	argumentsr+   r.   r<   r<   r=   add_additional_orm_attributes   sJ   


	rp   qualified_namestrattrnamec                 C  sr   |  |}|rt|jtsJ t|jg }nttj}t|}|j	d | |_
|j|_||_tt||jj|< d S )N.)lookup_fully_qualified_or_noner0   rD   r   r   r   r   rW   r   rH   	_fullnamer/   r6   r   r   rc   )r$   r#   rq   rs   symtype_varr<   r<   r=   rj   4  s   

rj   N)
r#   r
   r$   r   r%   r&   r'   r(   r)   r*   )r#   r
   r$   r   r'   r(   r)   r*   )r$   r   r:   r   rT   r   r;   rU   rP   rU   r)   r*   )
r$   r   r#   r
   rq   rr   rs   rr   r)   r*   )-
__future__r   typingr   r   r   
mypy.nodesr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   mypy.pluginr   mypy.plugins.commonr   
mypy.typesr   r   r   r   r   r   r   r    r   r    rc   r!   r"   r>   rS   r9   rp   rj   r<   r<   r<   r=   <module>   sJ   

5
U
H5