
    hE'                       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$ ddl"m%Z% 	  e&d        e'd       # e'$ r Y nw xY w G d! d"e      Z(d/d#Z)d0d$Z*d1d%Z+d1d&Z,d1d'Z-d1d(Z.d1d)Z/d1d*Z0d2d+Z1d3d,Z2	 	 	 	 	 	 d4d-Z3y.)5z"
Mypy plugin for SQLAlchemy ORM.

    )annotations)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)utilzsqlalchemy-stubszThe SQLAlchemy mypy plugin in SQLAlchemy 2.0 does not work with sqlalchemy-stubs or sqlalchemy2-stubs installed, as well as with any other third party SQLAlchemy stubs.  Please uninstall all SQLAlchemy stubs packages.c                  |    e Zd Z	 	 	 	 d	dZ	 	 	 	 d
dZ	 	 	 	 d
dZ	 	 	 	 d
dZ	 	 	 	 d
dZ	 	 	 	 ddZ	 	 	 	 ddZ	y)SQLAlchemyPluginc                Z    t        j                  |      t         j                  u rt        S y N)r   type_id_for_fullnameDECLARATIVE_BASE_dynamic_class_hookselffullnames     CD:\EasyAligner\venv\Lib\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_hookC   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_hookH   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_hook[   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_hooke   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_hooks   s      ;
 +*r,   c                
    g dS )N))
   sqlalchemy.orm)rL   zsqlalchemy.orm.attributesrN   )rL   zsqlalchemy.orm.decl_apirN    )r(   files     r*   get_additional_depsz$SQLAlchemyPlugin.get_additional_deps}   s    
 	
r,   N)r)   strreturnz2Optional[Callable[[DynamicClassDefContext], None]])r)   rR   rS   z+Optional[Callable[[ClassDefContext], None]])r)   rR   rS   z,Optional[Callable[[AttributeContext], Type]])rP   r   rS   zList[Tuple[int, str, int]])
__name__
__module____qualname__r+   r/   r=   rA   rF   rJ   rQ   rO   r,   r*   r!   r!   ;   s    	;##	4#
	4&	4	4	5

	#
r,   r!   c                    t         S r#   )r!   )versions    r*   pluginrY      s    r,   c                   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   )ctxr[   rd   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
MemberExprr`   exprr   ra   lookup_qualifiedr2   r   typer   r)   r   rn   )rq   	decoratortargetr;   sym_types        r*   r.   r.      s3   WW''	 y%..19++U-=-=>  %%)>>%%Fy%"2"23(*Ffkk8,''**  &$ + C 388&sxx0H(H-%-]]%;%;$<Afkk]"K 		GG9 <B;;G HHW (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   ri   r[   ra   )rq   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[   re   ra   r   rh   rd   r   ri   )rq   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   rh   r[   rd   r   ri   ra   rq   s    r*   r:   r:     s=    SWW\\";;r,   c                V    t        j                  | j                  j                         y r#   )r   rh   r[   rd   r   s    r*   r@   r@     s    SWW\\"r,   c                n    t        |        t        j                  | j                  | j                         y r#   )r_   r   ri   r[   ra   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

    rM   Mapped__sa_MappedN)r   
add_globalr   s    r*   r_   r_     s     	OOC)8]Cr,   c                    |j                   }| j                  d      }|t        |j                  t              sJ t        |j                  g       x|_        |_        y )Nz'sqlalchemy.orm.decl_api.DeclarativeMeta)rd   lookup_fully_qualified_or_nonerC   r2   r   r   declared_metaclassmetaclass_type)ra   
target_clsrd   r;   s       r*   re   re   '  sU     ??D

,
,1C ?z#((H===4<SXXr4JJDd1r,   N)rX   rR   rS   zTypingType[SQLAlchemyPlugin])rq   r   rS   None)rq   r   rS   r   )rq   r   rS   r   )rq   z.Union[ClassDefContext, DynamicClassDefContext]rS   r   )ra   r   r   r   rS   r   )4__doc__
__future__r   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   
__import__ImportErrorr!   rY   r&   r.   r5   r8   r:   r@   rE   rI   r_   re   rO   r,   r*   <module>r      s    #     %   "       " &  ( ' .  7 &     !" 	   		J
v J
Z$N3lN"
#N
!DK	(K6>K	Ks   2C C
	C
