
    [h&                       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)d?d+Z*d@d-Z+d@d.Z,d@d/Z-d@d0Z.d@d1Z/d@d2Z0dAd5Z1dBd7Z2dCd<Z3d=S )Dz"
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                  F    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	dS )SQLAlchemyPluginfullnamestrreturn2Optional[Callable[[DynamicClassDefContext], None]]c                T    t          j        |          t           j        u rt          S d S N)r   type_id_for_fullnameDECLARATIVE_BASE_dynamic_class_hookselfr"   s     i/var/www/api.easyaligner.net/htdocs/venv_linux/lib/python3.11/site-packages/sqlalchemy/ext/mypy/plugin.pyget_dynamic_class_hookz'SQLAlchemyPlugin.get_dynamic_class_hook<   s(     %h//53III&&t    +Optional[Callable[[ClassDefContext], None]]c                    t           S r'   )_fill_in_decoratorsr+   s     r-   get_customize_class_mro_hookz-SQLAlchemyPlugin.get_customize_class_mro_hookC   s
     #"r/   c                
   |                      |          }|k|j        dt          j        |j                  }|t          j        u rt
          S |t          j        t          j        fv rt          S |t          j	        u rt          S d S 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3?sx3238<<G%000**$)   0/E333..tr/   c                T    t          j        |          t           j        u rt          S d S r'   )r   r(   DECLARATIVE_META_metaclass_cls_hookr+   s     r-   get_metaclass_hookz#SQLAlchemyPlugin.get_metaclass_hook[   s*     %h//53III '&tr/   c                    |                      |          }|r:t          |j        t                    r t	          j        |j                  rt          S d S r'   )r5   
isinstancer6   r   r   has_declarative_base_base_cls_hook)r,   r"   r?   s      r-   get_base_class_hookz$SQLAlchemyPlugin.get_base_class_hooke   sY     ))(33 	"38X..	" )#(33	"
 "!tr/   ,Optional[Callable[[AttributeContext], Type]]c                >    |                     d          rt          S d S )Nz-sqlalchemy.orm.attributes.QueryableAttribute.)
startswith_queryable_getattr_hookr+   s     r-   get_attribute_hookz#SQLAlchemyPlugin.get_attribute_hooks   s,     ;
 
 	+ +*tr/   filer   List[Tuple[int, str, int]]c                
    g dS )N))
   sqlalchemy.orm)rS   zsqlalchemy.orm.attributesrU   )rS   zsqlalchemy.orm.decl_apirU    )r,   rP   s     r-   get_additional_depsz$SQLAlchemyPlugin.get_additional_deps}   s    
 
 
 	
r/   N)r"   r#   r$   r%   )r"   r#   r$   r0   )r"   r#   r$   rK   )rP   r   r$   rQ   )
__name__
__module____qualname__r.   r3   rA   rE   rJ   rO   rW   rV   r/   r-   r!   r!   ;   s           # # # #
   &         
 
 
 
 
 
r/   r!   versionr#   r$   TypingType[SQLAlchemyPlugin]c                    t           S r'   )r!   )r[   s    r-   pluginr^      s    r/   ctxr   Nonec                6   t          |            t          | j        t          g                     }| j                            | j                  |_        t          t                      || j        j	                  }||_
        t          | j        |           t          j        | j        dt          f          }|ut!          |j        t                    r[t          j        |j                   t'          j        |j        j        | j        d           t-          |j        g           g|_        n,| j                            t2          j                  }|g|_        	 t7          |           nc# t8          $ rV t          j        | j        d| j                   | j                            t2          j                  }|g|_        d|_        Y nw xY w| j                            | j        tA          tB          |                     t          j        |           dS )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   rG   r6   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   )r_   rb   rk   cls_argobjs        r-   r*   r*      s    
38U2YY
'
'C7))#(33CLKMM3(:;;DCHsw,,,%ch8+NNNGz',AA&&&?Lswd	
 	
 	
 	
 w|R001

g  !ABBU
$d $ $ $	GEsx	
 	
 	
 g  !ABBU
#$ G!!#(OD$,G,GHHHTs   E/ /AGGr   c                   | j         j        D ]7}t          |t          j                  r7t          |j        t          j                  r|j        j        dk    r|j        }n)t          |t          j                  r|j        dk    r|}n}t          |j        t                    r(| j
                            |j        j        |d          }n|ru|j        rnt          |j                  }t          |t                    r|j        j         d|j         |_        t#          j        | j
        d|j        z  |j                   9d S )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())rb   
decoratorsrG   r
   CallExprcallee
MemberExprrg   exprr   rh   lookup_qualifiedr6   r   typer   r"   r   ru   )r_   	decoratortargetr?   sym_types        r-   r2   r2      sb   W' 2 2	 y%.11	9+U-=>>	  %)>>>%FFy%"233	(**FFfk8,, 	'** &$ +  CC  	38 	&sx00H(H-- %-]%;"K"Kfk"K"K 	G9 <B;G H  W2 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                   d S r'   )rf   rG   reasonr
   r   r   RefExprr6   Varr   r   r   r   r7   REGISTRYr   rp   rb   rh   )r_   r   	node_types      r-   r9   r9      s    cj%"233333:?DdEM**Oz$)UY/O/OOOO	//I 	9h''(88ENJJJJ ;CGSWMMMMMr/   c                    t          |            | j        }t          | j        |           t	          j        | j        j                   t          j        || j        d           d S NTrd   )	rf   rb   rl   rh   r   ro   rk   r   rp   )r_   rb   s     r-   r<   r<      sk    
'Csw,,,SW\""";SWD     r/   c                    t          |            t          j        | j        j                   t          j        | j        | j        d           d S r   )rf   r   ro   rb   rk   r   rp   rh   r_   s    r-   r>   r>     sT    SW\""";     r/   c                B    t          j        | j        j                   d S r'   )r   ro   rb   rk   r   s    r-   rD   rD     s    SW\"""""r/   c                b    t          |            t          j        | j        | j                   d S r'   )rf   r   rp   rb   rh   r   s    r-   rI   rI     s-    ;CGSWMMMMMr/   r   r   c                    | j         S r'   )default_attr_typer   s    r-   rN   rN     s       r/   .Union[ClassDefContext, DynamicClassDefContext]c                4    t          j        | ddd           dS )z`Add __sa_DeclarativeMeta and __sa_Mapped symbol to the global space
    for all class defs

    rT   Mapped__sa_MappedN)r   
add_globalr   s    r-   rf   rf     s!     	OC)8]CCCCCr/   rh   r   
target_clsr   c                    |j         }|                     d          }|t          |j        t                    sJ t          |j        g           x|_        |_        d S )Nz'sqlalchemy.orm.decl_api.DeclarativeMeta)rk   lookup_fully_qualified_or_nonerG   r6   r   r   declared_metaclassmetaclass_type)rh   r   rk   r?   s       r-   rl   rl   '  s`     ?D

,
,1 C ?z#(H==???4<SXr4J4JJDd111r/   N)r[   r#   r$   r\   )r_   r   r$   r`   )r_   r   r$   r`   )r_   r   r$   r   )r_   r   r$   r`   )rh   r   r   r   r$   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!   r^   r*   r2   r9   r<   r>   rD   rI   rN   rf   rl   rV   r/   r-   <module>r      s    # " " " " "                         % % % % % %             " " " " " "                                     " " " " " " & & & & & &       ( ( ( ( ( ( ' ' ' ' ' ' . . . . . .       7 7 7 7 7 7 & & & & & &                              J!""" +	    	 	 	D	J
 J
 J
 J
 J
v J
 J
 J
Z   $ $ $ $N3 3 3 3lN N N N"
 
 
 
   # # # #N N N N
! ! ! !D D D DK K K K K Ks   2C CC