
    gC                    .   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' d d$l$m(Z( 	 d+	 	 	 	 	 	 	 d,d%Z)	 	 	 	 	 	 	 	 	 	 	 	 d-d&Z*	 	 	 	 	 	 	 	 	 	 d.d'Z+	 	 	 	 	 	 	 	 	 	 d/d(Z,	 	 	 	 	 	 d0d)Z-y*)1    )annotations)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)utilc                   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)clsapiis_mixin_scaninfomapped_attributessym_namesymstmts           ]/var/www/html/AdoubleTech/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/decl_class.py,scan_declarative_assignments_and_apply_typesrC   0   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    c           	        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>]namelinecolumntypr=   )%r   typer4   r   r%   type_id_for_named_nodeMAPPEDRELATIONSHIPCOMPOSITE_PROPERTYMAPPER_PROPERTYSYNONYM_PROPERTYCOLUMN_PROPERTYargsCOLUMNr    r   lookup_qualifiedrH   nodehas_base_type_id
TYPEENGINEr!   r$   #extract_python_type_from_typeenginer   r&   failformatr*   r   r   special_formappendSQLAlchemyAttributerI   rJ   r=   )r:   r;   rH   value
attributes
value_typeleft_hand_explicit_typetype_iderrtypeengine_argr@   msgs               rB   r2   r2   r   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   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   rF   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>]rG   ):
decoratorsr4   r   r   r   r%   rM   DECLARED_ATTRr/   r0   indexr&   name_is_dunderrH   r   r   r]   varrW   r   r   rL   funcr   ret_typer    type_id_for_unbound_typerN   rO   rP   rQ   rR   rS   rT   r   rU   rV   r   rX   rY   r!   r$   rZ   r   r[   r\   r*   unbound_to_instance
named_typeNAMED_TYPE_SQLA_MAPPEDexpr_to_mapped_constructorr   	argumentsr^   r_   rI   rJ   r=   )r:   r;   rA   ra   dec	dec_indexrc   any_	left_nodenew_stmt	func_typerd   rf   r@   rg   rvalues                   rB   r6   r6      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MappedrG   )*lvaluesr4   r   r=   r%   getrH   rW   r   r   
parse_boolr|   r&   set_is_baseset_has_tabler+   r   r[   r1   r   r#   apply_mypy_mapped_attris_inferredrL   r    rV   rM   rN   r   rT   r   r   r   calleer   r$   #infer_type_from_right_hand_nameexprr^   r_   rI   rJ   apply_type_to_mapped_statement)r:   r;   rA   ra   lvaluer@   rW   itemleft_hand_mapped_typerc   
mapped_sym	node_typepython_type_for_types                rB   r5   r5   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   r7   r7     sc     S#&D|XXa^ 	
	((4
 	5NNCt	
	
rD   N)F)r:   r	   r;   r   r<   boolreturnz(Optional[List[util.SQLAlchemyAttribute]])r:   r	   r;   r   rH   strr`   r   ra   List[util.SQLAlchemyAttribute]r   None)
r:   r	   r;   r   rA   r
   ra   r   r   r   )
r:   r	   r;   r   rA   r   ra   r   r   r   )r:   r	   r;   r   r   r   ).
__future__r   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&   rC   r2   r6   r5   r7    rD   rB   <module>r      sw   #    %     !  !  &   ! &    7  # &   !    "        ?	?	(? ? .	?DV
	V
	(V
 V
 	V

 /V
 
V
rY(	Y(	(Y( Y( /	Y(
 
Y(x		(  /	
 
D
	
	(
 

rD   