
    +hJ$                     2   d 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#  G d de      Z$d e%d!ee$   fd"Z&d#ed!d$fd%Z'd#ed!d$fd&Z(d#ed!d$fd'Z)d#ed!d$fd(Z*d#ed!d$fd)Z+d#ed!d$fd*Z,d#ed!d$fd+Z-d#ed!efd,Z.d#eeef   d!d$fd-Z/d.ed/ed!d$fd0Z0y$)1z"
Mypy plugin for SQLAlchemy ORM.

    )Callable)List)Optional)Tuple)Type)Union)nodes)calculate_mro)MroError)Block)ClassDef)GDEF)MypyFile)NameExpr)SymbolTable)SymbolTableNode)TypeInfo)AttributeContext)ClassDefContext)DynamicClassDefContext)Plugin)SemanticAnalyzerPluginInterface)get_proper_type)Instance   )
decl_class)names)utilc                       e Zd Zdedeeegdf      fdZdedeeegdf      fdZ	dedeeegdf      fdZ
dedeeegdf      fdZdedeeegdf      fdZdedeeegef      fd	Zd
edeeeeef      fdZy)SQLAlchemyPluginfullnamereturnNc                 Z    t        j                  |      t         j                  u rt        S y N)r   type_id_for_fullnameDECLARATIVE_BASE_dynamic_class_hookselfr!   s     M/var/www/html/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/plugin.pyget_dynamic_class_hookz'SQLAlchemyPlugin.get_dynamic_class_hook-   s&     %%h/53I3II&&    c                     t         S r$   )_fill_in_decoratorsr(   s     r*   get_customize_class_mro_hookz-SQLAlchemyPlugin.get_customize_class_mro_hook4   s
     #"r,   c                 0   | j                  |      }||j                  wt        j                  |j                        }|t        j                  u rt
        S |t        j                  t        j                  fv rt        S |t        j                  u rt        S y r$   )lookup_fully_qualifiednoder   type_id_for_named_nodeMAPPED_DECORATOR_cls_decorator_hookAS_DECLARATIVEAS_DECLARATIVE_BASE_base_cls_decorator_hookDECLARATIVE_MIXIN_declarative_mixin_hook)r)   r!   symtype_ids       r*   get_class_decorator_hookz)SQLAlchemyPlugin.get_class_decorator_hook9   s     ))(3?sxx322388<G%000**$$))  0/E333..r,   c                 Z    t        j                  |      t         j                  u rt        S y r$   )r   r%   DECLARATIVE_META_metaclass_cls_hookr(   s     r*   get_metaclass_hookz#SQLAlchemyPlugin.get_metaclass_hookM   s(     %%h/53I3II '&r,   c                     | j                  |      }|r?t        |j                  t              r%t	        j
                  |j                        rt        S y r$   )r1   
isinstancer2   r   r   has_declarative_base_base_cls_hook)r)   r!   r;   s      r*   get_base_class_hookz$SQLAlchemyPlugin.get_base_class_hookW   sB     ))(3 388X.))#((3!!r,   c                 2    |j                  d      rt        S y )Nz-sqlalchemy.orm.attributes.QueryableAttribute.)
startswith_queryable_getattr_hookr(   s     r*   get_attribute_hookz#SQLAlchemyPlugin.get_attribute_hooke   s      ;
 +*r,   filec                 
    ddgS )N)
   sqlalchemy.orm.attributes)rM   zsqlalchemy.orm.decl_apirO    )r)   rK   s     r*   get_additional_depsz$SQLAlchemyPlugin.get_additional_depso   s     2/
 	
r,   )__name__
__module____qualname__strr   r   r   r+   r   r/   r=   rA   rF   r   r   rJ   r   r   r   intrQ   rP   r,   r*   r    r    ,   s   	(23T9:	;##	(O,d23	4#
	(O,d23	4(	(O,d23	4	(O,d23	4	(,-t34	5

	eCcM"	#
r,   r    versionr"   c                     t         S r$   )r    )rW   s    r*   pluginrY   x   s    r,   ctxNc                    t        |        t        | j                  t        g             }| j                  j                  | j                        |_        t        t               || j                  j                        }||_
        t        | j                  |       t        j                  | j                  dt        f      }|t!        |j"                  t              rrt        j$                  |j"                         t'        j(                  |j"                  j*                  | j                  d       t-        |j"                  g       g|_        n1| j                  j1                  t2        j4                        }|g|_        	 t7        |       | j                  j?                  | j                  tA        tB        |             t        j$                  |       y# t8        $ rf t        j:                  | j                  d| j                         | j                  j1                  t2        j4                        }|g|_        d|_        Y w xY w)zZGenerate a declarative Base class when the declarative_base() function
    is encountered.cls)
expr_typesNTis_mixin_scanz.Not able to calculate MRO for declarative base)"_add_globalsr   namer   apiqualified_namer!   r   r   
cur_mod_idinfo_set_declarative_metaclassr   get_callexpr_kwargcallr   rC   r2   set_is_baser   ,scan_declarative_assignments_and_apply_typesdefnr   bases
named_typer   NAMED_TYPE_BUILTINS_OBJECTr
   r   failfallback_to_anyadd_symbol_table_noder   r   )rZ   r\   re   cls_argobjs        r*   r'   r'   |   s    
388U2Y
'C77))#((3CLKM3(:(:;DCHsww,%%chh8+NGz',,A&??LLswwd	
 w||R01
gg  !A!ABU
$d GG!!#((OD$,GHT  $		GGEsxx	
 gg  !A!ABU
#$s   G A,IIc                 .   | j                   j                  D ]{  }t        |t        j                        rJt        |j
                  t        j                        r&|j
                  j                  dk(  r|j
                  }n-t        |t        j                        r|j                  dk(  r|}nt        |j                  t              r3| j                  j                  |j                  j                  |d      }n|s|j                  st        |j                        }t        |t              r,|j                  j                    d|j                   |_        Dt#        j$                  | j                  d|j                  z  |j                         ~ y )Nas_declarative_basemappedT)suppress_errors.zClass decorator called %s(), but we can't tell if it's from an ORM registry.  Please annotate the registry assignment, e.g. my_registry: registry = registry())r\   
decoratorsrC   r	   CallExprcallee
MemberExprra   exprr   rb   lookup_qualifiedr2   r   typer   r!   r   ro   )rZ   	decoratortargetr;   sym_types        r*   r.   r.      s8   WW'' 2	 y%..19++U-=-=>  %%)>>%%Fy%"2"23(*Ffkk8,''**  &$ + C 388&sxx0H(H-%-]]%;%;$<Afkk]"K 		GG9 <B;;G HHW2r,   c                 &   t        |        t        | j                  t        j                        sJ | j                  j
                  }t        |t        j                        r$t        |j                  t        j                        sJ t        |j                  j                        }t        |t              r/t        j                  |j                        t        j                  u sJ t        j                   | j"                  | j$                         y r$   )r`   rC   reasonr	   r|   r}   RefExprr2   Varr   r   r   r   r3   REGISTRYr   rj   r\   rb   )rZ   r}   	node_types      r*   r5   r5      s    cjj%"2"2333::??DdEMM*z$))UYY/OOO		/I 	9h'((8ENNJ	K ;;CGGSWWMr,   c                     t        |        | j                  }t        | j                  |       t	        j
                  | j                  j                         t        j                  || j                  d       y NTr^   )	r`   r\   rf   rb   r   ri   re   r   rj   )rZ   r\   s     r*   r8   r8      sP    
''Csww,SWW\\";;SWWDr,   c                     t        |        t        j                  | j                  j                         t        j                  | j                  | j                  d       y r   )r`   r   ri   r\   re   r   rj   rb   rZ   s    r*   r:   r:      s=    SWW\\";;r,   c                 V    t        j                  | j                  j                         y r$   )r   ri   r\   re   r   s    r*   r@   r@      s    SWW\\"r,   c                 n    t        |        t        j                  | j                  | j                         y r$   )r`   r   rj   r\   rb   r   s    r*   rE   rE     s"    ;;CGGSWWMr,   c                     | j                   S r$   )default_attr_typer   s    r*   rI   rI     s        r,   c                 4    t        j                  | ddd       y)z`Add __sa_DeclarativeMeta and __sa_Mapped symbol to the global space
    for all class defs

    rN   Mapped__sa_MappedN)r   
add_globalr   s    r*   r`   r`     s     	OOC4hNr,   rb   
target_clsc                     |j                   }| j                  d      }|t        |j                  t              sJ t        |j                  g       x|_        |_        y )Nz'sqlalchemy.orm.decl_api.DeclarativeMeta)re   lookup_fully_qualified_or_nonerC   r2   r   r   declared_metaclassmetaclass_type)rb   r   re   r;   s       r*   rf   rf     sU     ??D

,
,1C ?z#((H===4<SXXr4JJDd1r,   )1__doc__typingr   r   r   r   r   
TypingTyper   mypyr	   mypy.mror
   r   
mypy.nodesr   r   r   r   r   r   r   r   mypy.pluginr   r   r   r   r   
mypy.typesr   r    r   r   r   r    rU   rY   r'   r.   r5   r8   r:   r@   rE   rI   r`   rf   rP   r,   r*   <module>r      sl       %   "       " &  ( ' .  7 &     I
v I
XC J'78 $3 $ $N3_ 3 3lN_ N N"
/ 
d 
 T #_ # #N ND N
!!1 !d !OeO-CCD O OK	(K6>K	Kr,   