o
    E6dE*                     @  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    Zfailtyper   r   r   r   appendZSQLAlchemyAttributer,   r-   r/   apply_type_to_mapped_statement)r#   r$   r%   r'   r+   stmtleft_hand_explicit_type r:   pC:\Users\jesus\OneDrive\Desktop\erpjis_fastapi\backend\jisbackend\Lib\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   NZ_empty_constructorT)r2   r3   r0   r   r4   r   r+   noder   r5   r   r   rvaluer	   Zcalleer   exprfullnamer"   argsr   r   Z#infer_type_from_right_hand_nameexprr   
named_typer    Zset_mapped_attributesr/   )
r#   r$   r'   Zmapped_attr_lookupZupdate_cls_metadatar8   	left_nodepython_type_for_typeZleft_node_proper_typeZnew_python_type_for_typer:   r:   r;    re_apply_declarative_assignmentsb   s   	






rI   r8   r   lvaluer   r9   Optional[ProperType]rH   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::

        class User(Base):
            # ...

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

    NF)rA   r0   r   Zis_inferred_defrF   r"   r5   r   r   special_formr!   rB   )r$   r8   rJ   r9   rH   rG   r:   r:   r;   r7      s$   
r7   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+   r5   r=   r:   r:   r;   r@     s    z1add_additional_orm_attributes.<locals>.<dictcomp>r   Z
sqlalchemy)variableZtype_annotationZinitializerkindZ	__table__zsqlalchemy.sql.schema.Tablezsqlalchemy.orm.mapper.MapperZ
__mapper__)r    Zinfo_for_clsZget_is_basenamesmrometadataZget_mapped_attributes
setdefaultr+   r5   itemsr   r   rL   r6   r   r   r   r   r   r   Zget_has_table _apply_placeholder_attr_to_class)r#   r$   r'   r/   Zis_baseZmapped_attr_namesbaseZbase_cls_attributesr?   	argumentsr+   r.   r:   r:   r;   add_additional_orm_attributes   sJ   


	rY   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.)Zlookup_fully_qualified_or_noner0   rA   r   r   r   r   rL   r   rD   Z	_fullnamer/   r5   r   r   rQ   )r$   r#   rZ   r\   symtype_varr:   r:   r;   rV   .  s   

rV   N)
r#   r
   r$   r   r%   r&   r'   r(   r)   r*   )r#   r
   r$   r   r'   r(   r)   r*   )r$   r   r8   r   rJ   r   r9   rK   rH   rK   r)   r*   )
r$   r   r#   r
   rZ   r[   r\   r[   r)   r*   )-
__future__r   typingr   r   r   Z
mypy.nodesr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   Zmypy.pluginr   Zmypy.plugins.commonr   Z
mypy.typesr   r   r   r   r   r   r   r    r   r    rQ   r!   r"   r<   rI   r7   rY   rV   r:   r:   r:   r;   <module>   sJ   

5
U
B5