
    -hL)                     b   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!\S"\\\4   S#\\"RJ                     S$S%4
S& jr&S \	S!\S#\\"RJ                     S$S%4S' jr'S!\S(\S)\S*\\   S+\\   S$S%4S, jr(S \	S!\S#\\"RJ                     S$S%4S- jr)S!\S \	S.\*S/\*S$S%4
S0 jr+g%)1    )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)NAMED_TYPE_SQLA_MAPPEDclsapiitem
attributesreturnNc           
      F   [        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R                  U5      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formattyper   r   r   r   appendSQLAlchemyAttributer)   r*   r,   apply_type_to_mapped_statement)r"   r#   r$   r%   r(   stmtleft_hand_explicit_types          nC:\Users\ROHAN GUPTA\OneDrive\Desktop\mathbuddy-assessment\venv\Lib\site-packages\sqlalchemy/ext/mypy/apply.pyapply_mypy_mapped_attrr;   0   sN    $!!yy	D'	"	"zzt^,,4<<?H55Q$$,  			#7>>tDcJ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H]  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ag  UR                  R                  R                   R                  Gb;  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      (       ay  [*        R,                  " UUUU	UR                  R&                  S   R                  5      nUb  [        U[        5      (       a  GM  UUUR
                  S   R                      l	        SnUc  GM  [        UR                  [.        5      (       a+  UR                  R                  R"                  [$        :w  d  GMA  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/   r0   r-   r   r1   r   noder   r4   r   r   rvaluer	   calleer   exprfullnamer!   argsr   r   #infer_type_from_right_hand_nameexprr   
named_typer    set_mapped_attributesr,   )
r"   r#   r%   attrmapped_attr_lookupupdate_cls_metadatar8   	left_nodepython_type_for_typeleft_node_proper_types
             r:    re_apply_declarative_assignmentsrN   e   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 % (/:(+4 4 
 . #LLO((&*##/y~~x88>>&&//3II!$*-A,B"	A H ""388Z8 O Bs   Or8   lvaluer9   rL   c                    UR                   n[        U[        5      (       d   eUb  U R                  [        U/5      Ul        OGSUl        U R                  [        Uc  [        [        R                  5      /OU/5      =Ul        Ul        [        R                  " UR                  5      Ul        UR
                  b  Uc4  U R                  [        [        [        R                  5      /5      Ul        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::

    class User(Base):
        # ...

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

NF)r?   r-   r   rF   r!   r4   is_inferred_defr   r   special_formr    expr_to_mapped_constructorr@   )r#   r8   rO   r9   rL   rK   s         r:   r7   r7      s    2 Ii%%%% *"%<$=
	 "'%(^^"#+ Y++,-&'	&
 	
	& 11$++>DKyy08NN"WY-C-C%D$E
	 9r<   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(   r4   mrometadataget_mapped_attributes
setdefaultitemsr   r   rR   r5   r   r   r   r   r   r   get_has_table _apply_placeholder_attr_to_class)r"   r#   r%   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.qualified_nameattrnamec                    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,   r4   r   r   r`   )r#   r"   rn   ro   symtype_vars          r:   rg   rg   1  s     
,
,^
<C
#((H----$SXXr2	../
h-CLL3&1CMxxCHH.tS9CHHNN8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!   r6   r;   rN   r7   rm   strrg    r<   r:   <module>r      s      $  %    !    &    7 3  &   !   "     )2	2	(2 '!
"2 T--.	2
 
2jQ9	Q9	(Q9 T--.Q9 
	Q9h@
	(@

@
 @
 &j1	@

 #:.@
 
@
F2
	2
	(2
 T--.2
 
	2
j:	(:	: : 	:
 
:r<   