
    +hC                        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"l"m%Z% dd#l"m&Z& 	 d2d$ed%ed&e'd'eee&jP                        fd(Z)d$ed%ed)e*d*ed+ee&jP                     d'd,fd-Z+d$ed%ed.ed+ee&jP                     d'd,f
d/Z,d$ed%ed.ed+ee&jP                     d'd,f
d0Z-d$ed%ed'd,fd1Z.y,)3    )List)Optional)Union)AssignmentStmt)CallExpr)ClassDef)	Decorator)
LambdaExpr)ListExpr)
MemberExpr)NameExpr)PlaceholderNode)RefExpr)StrExpr)
SymbolNode)SymbolTableNode)TempNode)TypeInfo)Var)SemanticAnalyzerPluginInterface)AnyType)CallableType)get_proper_type)Instance)NoneType)
ProperType)Type)	TypeOfAny)UnboundType)	UnionType   )apply)infer)names)utilclsapiis_mixin_scanreturnc                    t        j                  | |      }|y | j                  j                  d      ry t        j                  ||      }t        j
                  |       ||st        j                  | ||       |S g }| j                  j                  s2|j                  j                         D ]  \  }}t        | ||||        nlt        j                  | j                  j                        D ]@  }t        |t              rt!        | |||       "t        |t"              s3t%        | |||       B t'        | |       |st        j(                  | ||       t        j*                  ||       |S )Nbuiltins)r%   info_for_clsfullname
startswithget_mapped_attributesestablish_as_sqlalchemyr"    re_apply_declarative_assignmentsdefsbodyr$   items_scan_symbol_table_entryflatten_typechecking
isinstancer   !_scan_declarative_assignment_stmtr	    _scan_declarative_decorator_stmt_scan_for_mapped_basesadd_additional_orm_attributesset_mapped_attributes)r&   r'   r(   infomapped_attributessym_namesymstmts           Q/var/www/html/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/decl_class.py,scan_declarative_assignments_and_apply_typesrC   .   s^    S#&D|		 	 	, 	""4- 
 	  &$
  223=NO  88== "ZZ--/ 	MHc$S(C):	
 --chhmm< 	D$/1d$5 D),0d$5	 3$++C6GHt%67    namevalue
attributesNc           	         t        |j                        }t        |t              syd}t	        j
                  |j                        }d}|t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  hv r*|j                  rt        |j                  d         }nFd}nB|t        j                  u r/|j                  sd}nt        |j                  d         }	t        |	t              r|	j                  }	t        |	t        t        f      r|j!                  |	j"                  |	      }
|
t        |
j$                  t              rt	        j&                  |
j$                  t        j(                        r5t+        t-        j.                  ||
j$                  g       t1               g      }n:t3        j4                  |dj7                  |
j$                  j8                        |       |rLd}t3        j4                  ||j7                  || j"                        |        t;        t<        j>                        }|j|j$                  J |jA                  t3        jB                  ||j$                  jD                  |j$                  jF                  || jH                               yy)zaExtract mapping information from a SymbolTableNode that's in the
    type.names dictionary.

    NFr   T4Column type should be a TypeEngine subclass not '{}'zCan't infer type from attribute {} on class {}. please specify a return type from this function that is one of: Mapped[<python type>], relationship[<target class>], Column[<TypeEngine>], MapperProperty[<python type>]rE   linecolumntypr=   )%r   typer7   r   r$   type_id_for_named_nodeMAPPEDRELATIONSHIPCOMPOSITE_PROPERTYMAPPER_PROPERTYSYNONYM_PROPERTYCOLUMN_PROPERTYargsCOLUMNr   r   lookup_qualifiedrE   nodehas_base_type_id
TYPEENGINEr    r#   #extract_python_type_from_typeenginer   r%   failformatr-   r   r   special_formappendSQLAlchemyAttributerK   rL   r=   )r&   r'   rE   rF   rG   
value_typeleft_hand_explicit_typetype_iderrtypeengine_argr@   msgs               rB   r5   r5   q   s8    !,Jj(+"**:??;G C     ??&5jooa6H&I#C	ELL	 C:I";N .(3!/!4!4.;*AB**>+>+>O?z#((H'E--chh8H8HI2; % I I$'2!" !)
	3/ 		006sxx7H7H0I&	 B 	 			#szz$137"))*@*@"A*zz%%%$$ZZ__zz((+XX	
 +rD   rA   c           	      	   |j                   D ]E  }t        |t        t        t        f      st        j                  |      t
        j                  u sE n y| j                  j                  j                  |      }d}t        j                  |j                        rt        t        j                         }t        |j"                  j                        }|j"                  |_        t'        |gt)        |            }	|j$                  j*                  |	_        |	| j                  j                  |<   yt        |j,                  j*                  t.              r|j,                  j*                  j0                  }
t        |
t2              rt        j4                  |
| |      }ny|t
        j6                  t
        j8                  t
        j:                  t
        j<                  t
        j>                  t
        j@                  hv r&|
jB                  rtE        |
jB                  d         }n|t
        jF                  u r |
jB                  r|
jB                  d   }t        |t2              r|jI                  |j                  |      }|t        |j$                  tJ              rt        jL                  |j$                  t
        jN                        r5tQ        tS        jT                  ||j$                  g       tW               g      }n:t        jX                  |dj[                  |j$                  j\                        |
       |Ud}t        jX                  ||j[                  |j"                  j                        |       t        t        j                         }t        |j"                  j                        }|j"                  |_        t        |t2              rtE        t        j^                  ||            }|ja                  t
        jb                  |g      |j$                  _        t        jd                  tg        |j,                  jh                  |j,                  j                              }t'        |g|      }	|j$                  j*                  |	_        |jk                  t        jl                  |j                  |jn                  |jp                  || jr                               |	| j                  j                  |<   y)a  Extract mapping information from a @declared_attr in a declarative
    class.

    E.g.::

        @reg.mapped
        class MyClass:
            # ...

            @declared_attr
            def updated_at(cls) -> Column[DateTime]:
                return Column(DateTime)

    Will resolve in mypy as::

        @reg.mapped
        class MyClass:
            # ...

            updated_at: Mapped[Optional[datetime.datetime]]

    Nr   rI   zCan't infer type from @declared_attr on function '{}';  please specify a return type from this function that is one of: Mapped[<python type>], relationship[<target class>], Column[<TypeEngine>], MapperProperty[<python type>]rJ   ):
decoratorsr7   r   r   r   r$   rO   DECLARED_ATTRr2   r3   indexr%   name_is_dunderrE   r   r   r_   varrY   r   r   rN   funcr   ret_typer   type_id_for_unbound_typerP   rQ   rR   rS   rT   rU   rV   r   rW   rX   r   rZ   r[   r    r#   r\   r   r]   r^   r-   unbound_to_instance
named_typeNAMED_TYPE_SQLA_MAPPEDexpr_to_mapped_constructorr
   	argumentsr`   ra   rK   rL   r=   )r&   r'   rA   rG   dec	dec_indexrc   any_	left_nodenew_stmt	func_typerd   rf   r@   rg   rvalues                   rB   r9   r9      s   8  sXz:>?,,S1U5H5HH 	##D)I48499% y--.TXX]]+		!9+x~>!++#+i 	DIINNL	1IINN++	i-44YSIG  ""((%%&&%% &5innQ6G&H#$&^^A.N.+6**>+>+>O?z#((H'E--chh8H8HI2; % I I$'2!" !)
	3/ 		006sxx7H7H0I%	 &
B 	 			#szz$((--0$7"))*@*@"A'IXXIN );7"1$$S*AB#
 ..$$'>&?INN ,,499&&		7F yk62HNN''HM  ;;'	
  (CHHMM)rD   c           	         |j                   d   }t        |t              sy| j                  j                  j                  |j                        }|J |j                  }t        |t              ry||j                  u sJ t        |t              sJ |j                  dk(  r=|j                  |j                        du rt        j                  | j                         y|j                  dk(  r t        j                  | j                         n|j                  j                  d      ry|j                  dk(  r|t        |j                  t               st        j"                  |d|       nJ|j                  j$                  D ]1  }t        |t        t&        f      st)        j*                  | |||       3 d}d}	|j,                  s|j.                  t        |j.                  t0              r|j.                  }	|j.                  j                  d	k(  r|j3                  d	|       }
|
|
j                  t	        j4                  |
j                        t        j6                  u rt9        |j.                  j:                  d         }	|j.                  }nst9        |j.                        }t        |t<              rJt	        j4                  |j.                        t        j6                  u rt9        |j:                  d         }	|}n|}	d}t        |j                  t>              r||	}not        |j                  t@              rTt        |j                  jB                  tD              r0tG        jH                  ||||	|j                  jB                        }|yy|J |jK                  t        jL                  |j                  |jN                  |jP                  || j                  
             t)        jR                  ||||	|       y)zZExtract mapping information from an assignment statement in a
    declarative class.

    r   N__abstract__T__tablename_____mypy_mapped_attrsz+_mypy_mapped_attrs is expected to be a listMappedrJ   )*lvaluesr7   r   r=   r$   getrE   rY   r   r   
parse_boolr|   r%   set_is_baseset_has_tabler.   r   r]   r4   r   r"   apply_mypy_mapped_attris_inferredrN   r   rX   rO   rP   r   rV   r   r   r   calleer   r#   #infer_type_from_right_hand_nameexprr`   ra   rK   rL   apply_type_to_mapped_statement)r&   r'   rA   rG   lvaluer@   rY   itemleft_hand_mapped_typerc   
mapped_sym	node_typepython_type_for_types                rB   r8   r8   g  sB    \\!_Ffh'
((..

V[[
)C
 ??88D$(6;;dC   yyN">>$++&$.SXX&	o	%388$			d	#	*	*$++x0IIcH$O)) MdXw$7800c4LM -148499,dii- '+ii#yy~~) 11(C@
*"344Z__E||$ />		q)/+ -1II) $DII.	y(+,,Y^^<L '6innQ6G&H#$-! '0#$(!$++x(-B-N
  7	DKK	*zG0  %HHt4dkk6H6H 
  ' 	+++  ;;$	
 
((rD   c                     t        j                  | |      }|y|j                  dd D ]6  }|j                  j	                  d      rt        |j                  |d       8 y)zGiven a class, iterate through its superclass hierarchy to find
    all other classes that are considered as ORM-significant.

    Locates non-mapped mixins and scans them for mapped attributes to be
    applied to subclasses.

    Nr!   r+   T)r(   )r%   r,   mror-   r.   rC   defn)r&   r'   r=   	base_infos       rB   r:   r:     sc     S#&D|XXa^ 	
	((4
 	5NNCt	
	
rD   )F)/typingr   r   r   
mypy.nodesr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   mypy.pluginr   
mypy.typesr   r   r   r   r   r   r   r   r   r     r"   r#   r$   r%   boolra   rC   strr5   r9   r8   r:    rD   rB   <module>r      s      %     !  !  &   ! &    7  # &   !    "        @	@	(@ @ d4++,-	@FW
	W
	(W
 W
 	W

 T--.W
 
W
tY(	Y(	(Y( Y( T--.	Y(
 
Y(x@	@	(@ @ T--.	@
 
@F
	
	(
 

rD   