
    +hq(                     X   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 e	d!ed"eeef   d#ee"jJ                     d$d%f
d&Z&d e	d!ed#ee"jJ                     d$d%fd'Z'd!ed(ed)ed*ee   d+ee   d$d%fd,Z(d e	d!ed#ee"jJ                     d$d%fd-Z)d!ed e	d.e*d/e*d$d%f
d0Z+y%)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           	      
   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j                  |      |        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formattyper   r   r   r   appendSQLAlchemyAttributer)   r*   r,   apply_type_to_mapped_statement)r"   r#   r$   r%   r(   stmtleft_hand_explicit_types          L/var/www/html/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/apply.pyapply_mypy_mapped_attrr;   *   sD    $!yy	D'	"zz 	t^,4<<?H5Q$$,	 			#7>>tDcJ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                        }|t        |t              r|||j
                  d   j                      _	        d}|t        |j                  t.              r)|j                  j                  j"                  t$        k7  s|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/   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   _   s    7AAd$))T/AA B 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 % (/:(+4 
 . #LLO((&*##/y~~x8>>&&//3II!$*-A,B"	ABH ""388Z8 O Bs   M+r8   lvaluer9   rL   c                    |j                   }t        |t              sJ || j                  t        |g      |_        nFd|_        | j                  t        |t        t        j                        gn|g      x|_        |_        t        j                  |j                        |_        |j
                  |4| j                  t        t        t        j                        g      |_        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::

        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           
      .   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(   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      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qualified_nameattrnamec                    | 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,   r4   r   r   r`   )r#   r"   rn   ro   symtype_vars          r:   rg   rg   +  s     
,
,^
<C
#((H---$SXXr2	../
h-CLL3&1CMxxCHCH.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<   