
    g_)                       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"Z(	 	 	 	 	 	 	 	 d)d#Z)	 	 	 	 	 	 	 	 	 	 	 	 d*d$Z*	 	 	 	 	 	 	 	 d)d%Z+	 	 	 	 	 	 	 	 	 	 d+d&Z,y'),    )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           	        t        |t              r|j                  }nt        |t              r|j                  }ny | j
                  j                  D ]O  }t        |t              st        |j                  d   t              s2|j                  d   j                  |k(  sO n t        j                  |d| |        y |j                  t        j                  |d|       y t        |j                        }t        |t        t        t        f      sJ |j!                  t        j"                  ||j$                  |j&                  || j(                               t+        |||j                  d   |d        y )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          X/var/www/html/AdoubleTech/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/apply.pyapply_mypy_mapped_attrr;   -   s@    $!yy	D'	"zz 	t^,4<<?H5Q$$,	 			#5dV<cByy		!		
 -dii8(I{!C     ;;'	
 #T4<<?$;T    c           	        |D ci c]  }|j                   | }}d}| j                  j                  D ]  }t        |t              st        |j
                  d   t              s3|j
                  d   j                   |v sOt        |j
                  d   j                  t              sw|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              rR|j                  j                  j                   j                  '|j                  j                  j                   j                  j"                  t$        k(  r|j                  j                  j                   dk(  rt        |j                  j&                  d   t              rt        |j                  j&                  d   j                  t(              rqt+        j,                  ||||	|j                  j&                  d   j                        }
|
5t        |
t              s%|
}|||j
                  d   j                      _	        d}t        |j                  t.              r)|j                  j                  j"                  t$        k7  s|J |j1                  t$        |g      |_	         |r!t3        j4                  | j6                  |       yyc c}w )zlFor 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Ad$))T/AA C t^,4<<?H5Q$$(::4<<?//5Q,,I#5Q$$$d ! %4INN$C! /="#8+Ft{{H5"4;;#5#5zB"4;;#5#5#:#:HE**//44@**//44==-.**//3GG"4;;#3#3A#6A"4;;#3#3A#6#=#=wG ==!-((+22 ) ,7
,kA ,D(
 - 't||A';';<A +/' y~~x8>>&&//3II+777!$*-A,B"	CCJ ""388Z8 Q Bs   M+c                l   |j                   }t        |t              sJ |$d|_        | j	                  t
        |g      |_        n?d|_        | j	                  t
        |t        t        j                        gn|g      |_        t        |j                        |_        |j                  |||_        yyy)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           
     .   t        j                  | |      }|yt        j                  |      }d|j                  vr|s|D ci c]  }|j                  |j
                   }}|j                  dd D ]W  }d|j                  vrt        j                  ||      }|+|D ](  }|j                  |j                  |j
                         * Y g }	|j                         D ]U  \  }
}|t        t        j                        }|	j                  t        t!        |
|      |t#        |      t$                     W t'        || d|	t)                      d|j                  vr#t        j*                  |      rt-        || dd       |st-        || d	d
       yyc c}w )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      s    S#&D|t$G#G>HIdTYY		1IIHHQrN 		CD4==0"&"<"<T3"G"*+ C!,,TYY		BC		C 	*002 
	ID#{i445 s^$' (&	
	 	Cj)WYG$**$););D)A(3[	
 (4l	
 A Js   Fc                   | j                  |      }|r3t        |j                  t              sJ t	        |j                  g       }nt        t        j                        }t        |      }|j                  dz   |z   |_
        |j                  |_        ||_        t        t        |      |j                  j                  |<   y )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CH.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<   