
    ,h_)                       S SK Jr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJ	r	  S SKJ
r
  S S	KJr  S S
KJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJ r   S SKJ!r!  SSK"J#r#  SSK"J$r$  SS K%J&r&  SS!K%J'r'            S(S" jr(        S)S# jr)            S*S$ jr*        S)S% jr+          S+S& jr,g'),    )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_MAPPEDc           
     .   [        U[        5      (       a  UR                  nO#[        U[        5      (       a  UR                  nOg U R
                  R                   H]  n[        U[        5      (       d  M  [        UR                  S   [        5      (       d  M>  UR                  S   R                  U:X  d  M]    O   [        R                  " USU 3U 5        g UR                  c  [        R                  " USU5        g [        UR                  5      n[        U[        [        [        45      (       d   eUR!                  [        R"                  " UUR$                  UR&                  UU R(                  S95        [+        XUR                  S   US 5        g )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)clsapiitem
attributesr%   stmtleft_hand_explicit_types          Q/var/www/auris/envauris/lib/python3.13/site-packages/sqlalchemy/ext/mypy/apply.pyapply_mypy_mapped_attrr;   -   sJ    $!!yy	D'	"	"zzt^,,4<<?H55Q$$,  			#5dV<cByy		!		
 -dii8(I{!C      ;;'	
 #4<<?$;T    c           	        U Vs0 s H  o3R                   U_M     nnSnU R                  R                   GHZ  n[        U[        5      (       d  M  [        UR
                  S   [        5      (       d  M?  UR
                  S   R                   U;   d  M^  [        UR
                  S   R                  [        5      (       d  M  UR
                  S   R                  nUUR
                  S   R                      R                  n[        UR                  5      n	[        U[        5      (       Ga  [        U	[        5      (       Gd  [        UR                  [        5      (       Ga  [        UR                  R                  [        5      (       Ga  [        UR                  R                  R                   [        5      (       Gae  UR                  R                  R                   R                  Gb9  UR                  R                  R                   R                  R"                  [$        :X  a  UR                  R                  R                   S:X  a  [        UR                  R&                  S   [        5      (       a  [        UR                  R&                  S   R                  [(        5      (       aw  [*        R,                  " UUUU	UR                  R&                  S   R                  5      n
U
b9  [        U
[        5      (       d$  U
nUXFR
                  S   R                      l	        Sn[        UR                  [.        5      (       a+  UR                  R                  R"                  [$        :w  d  GM9  Uc   eUR1                  [$        U/5      Ul	        GM]     U(       a"  [2        R4                  " U R6                  U5        ggs  snf )zdFor multiple class passes, re-apply our left-hand side types as mypy
seems to reset them in place.

Fr   N_empty_constructorT)r%   r,   r-   r*   r	   r.   r   noder   r0   r   r   rvaluer
   calleer   exprfullnamer#   argsr   r    #infer_type_from_right_hand_nameexprr   
named_typer!   set_mapped_attributesr)   )r4   r5   r7   attrmapped_attr_lookupupdate_cls_metadatar8   	left_nodepython_type_for_typeleft_node_proper_typenew_python_type_for_types              r:    re_apply_declarative_assignmentsrO   b   s    7AAjd))T/jA t^,,4<<?H55Q$$(::4<<?//55Q,,I#5Q$$$d ! %4INN$C! /=="#8+FFt{{H55"4;;#5#5zBB"4;;#5#5#:#:HEE**//44@**//44==-.**//3GG"4;;#3#3A#6AA"4;;#3#3A#6#=#=wGG ==!-((+22 ) ,7
,kA A ,D(
 - '||A';';<A +/' y~~x88>>&&//3II+777!$*-A,B"	C J ""388Z8 Q Bs   N>c                |   UR                   n[        U[        5      (       d   eUb$  SUl        U R	                  [
        U/5      Ul        O@SUl        U R	                  [
        Uc  [        [        R                  5      /OU/5      Ul        [        UR                  5      Ul        UR                  b  Ub  XAl        ggg)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)r?   r*   r   is_inferred_defrF   r#   r0   r   r   special_formr"   r@   )r5   r8   lvaluer9   rL   rK   s         r:   r3   r3      s    : Ii%%%% *!&"%<$=
	 "'" (/ //01*+
	* -T[[9DKyy!5!A(	 "Br<   c           
     f   [         R                  " X5      nUc  g[         R                  " U5      nSUR                  ;  Ga  U(       Gd  U Vs0 s H  oUR                  UR
                  _M     nnUR                  SS  H_  nSUR                  ;  a  M  [         R                  " Xq5      nUc  M0  U H)  nUR                  UR                  UR
                  5        M+     Ma     / n	UR                  5        HR  u  pUc  [        [        R                  5      nU	R                  [        [!        X5      U[#        U5      [$        S95        MT     ['        XSU	[)        5       5        SUR                  ;  a(  [         R*                  " U5      (       a  [-        XSS5        U(       d  [-        XS	S
5        ggs  snf )zCApply __init__, __table__ and other attributes to the mapped class.N__init__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namesr%   r0   mrometadataget_mapped_attributes
setdefaultitemsr   r   rR   r1   r   r   r   r   r   r   get_has_table _apply_placeholder_attr_to_class)r4   r5   r7   r)   is_baserH   mapped_attr_namesbasebase_cls_attributes	argumentsr%   r(   s               r:   add_additional_orm_attributesrm      ss    S&D|t$G#G>HIjdYY		1jIHHQrND4==0"&"<"<T"G"*+!,,TYY		B , # 	*002ID{i445 ^$' (&	 3 	Cj)WYG$**$););D)A)A(3[	
 (4l	
 A Js    F.c                   U R                  U5      nU(       a8  [        UR                  [        5      (       d   e[	        UR                  / 5      nO[        [        R                  5      n[        U5      nUR                  S-   U-   Ul
        UR                  Ul        XVl        [        [        U5      UR                  R                  U'   g )N.)lookup_fully_qualified_or_noner*   r?   r   r   r   r   rR   r   rC   	_fullnamer)   r0   r   r   r`   )r5   r4   qualified_nameattrnamesymtype_vars          r:   rg   rg   4  s     
,
,^
<C
#((H----$SXXr2	../
h-CLL3&1CMxxCHH.tS9CHHNN8r<   N)
r4   r   r5   r   r6   zUnion[NameExpr, StrExpr]r7   List[util.SQLAlchemyAttribute]returnNone)r4   r   r5   r   r7   rw   rx   ry   )r5   r   r8   r	   rS   r   r9   Optional[ProperType]rL   rz   rx   ry   )
r5   r   r4   r   rr   strrs   r{   rx   ry   )-
__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!   r`   r"   r#   r;   rO   r3   rm   rg    r<   r:   <module>r      sl   #    $  %    !    &    7 3  &   !   "     - )2	2	(2 #2 /	2
 
2jR9	R9	(R9 /R9 
	R9jE)	(E)
E) E) 2	E)
 /E) 
E)P2
	2
	(2
 /2
 
	2
j:	(:	: : 	:
 
:r<   