o
    E6dE'                     @  s  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% z	e&d W e'd  e'y   Y nw G d!d" d"eZ(dId'd(Z)dJd,d-Z*dKd/d0Z+dKd1d2Z,dKd3d4Z-dKd5d6Z.dKd7d8Z/dKd9d:Z0dLd=d>Z1dMd@dAZ2dNdFdGZ3dHS )Oz"
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                   @  sR   e Zd ZdddZddd	Zdd
dZdddZdddZdddZdddZ	dS )SQLAlchemyPluginfullnamestrreturn2Optional[Callable[[DynamicClassDefContext], None]]c                 C     t |t ju r
tS d S N)r   type_id_for_fullnameZDECLARATIVE_BASE_dynamic_class_hookselfr     r*   qC:\Users\jesus\OneDrive\Desktop\erpjis_fastapi\backend\jisbackend\Lib\site-packages\sqlalchemy/ext/mypy/plugin.pyget_dynamic_class_hook<   s   z'SQLAlchemyPlugin.get_dynamic_class_hook+Optional[Callable[[ClassDefContext], None]]c                 C     t S r%   )_fill_in_decoratorsr(   r*   r*   r+   get_customize_class_mro_hookC   s   z-SQLAlchemyPlugin.get_customize_class_mro_hookc                 C  s\   |  |}|d ur,|jd ur,t|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_nodeZMAPPED_DECORATOR_cls_decorator_hookZAS_DECLARATIVEZAS_DECLARATIVE_BASE_base_cls_decorator_hookZDECLARATIVE_MIXIN_declarative_mixin_hook)r)   r    symZtype_idr*   r*   r+   get_class_decorator_hookH   s   


z)SQLAlchemyPlugin.get_class_decorator_hookc                 C  r$   r%   )r   r&   ZDECLARATIVE_META_metaclass_cls_hookr(   r*   r*   r+   get_metaclass_hook[   s   z#SQLAlchemyPlugin.get_metaclass_hookc                 C  s.   |  |}|rt|jtrt|jrtS d S r%   )r1   
isinstancer2   r   r   Zhas_declarative_base_base_cls_hook)r)   r    r7   r*   r*   r+   get_base_class_hooke   s   


z$SQLAlchemyPlugin.get_base_class_hook,Optional[Callable[[AttributeContext], Type]]c                 C  s   | drtS d S )Nz-sqlalchemy.orm.attributes.QueryableAttribute.)
startswith_queryable_getattr_hookr(   r*   r*   r+   get_attribute_hooks   s
   z#SQLAlchemyPlugin.get_attribute_hookfiler   List[Tuple[int, str, int]]c                 C  s   g dS )N))
   sqlalchemy.orm)rD   zsqlalchemy.orm.attributesrF   )rD   zsqlalchemy.orm.decl_apirF   r*   )r)   rB   r*   r*   r+   get_additional_deps}   s   z$SQLAlchemyPlugin.get_additional_depsN)r    r!   r"   r#   )r    r!   r"   r-   )r    r!   r"   r>   )rB   r   r"   rC   )
__name__
__module____qualname__r,   r0   r8   r:   r=   rA   rG   r*   r*   r*   r+   r   ;   s    







r   versionr!   r"   TypingType[SQLAlchemyPlugin]c                 C  r.   r%   )r   )rK   r*   r*   r+   plugin   s   rM   ctxr   Nonec                 C  s0  t |  t| jtg }| j| j|_tt || jj	}||_
t| j| tj| jdtfd}|durTt|jtrTt|j tj|jj| jdd t|jg g|_n| jtj}|g|_zt| W n  ty   t| jd| j | jtj}|g|_d|_Y nw | j| jt t!| t| dS )zZGenerate a declarative Base class when the declarative_base() function
    is encountered.cls)Z
expr_typesNTZis_mixin_scanz.Not able to calculate MRO for declarative base)"_add_globalsr   namer   apiZqualified_namer    r   r   Z
cur_mod_idinfo_set_declarative_metaclassr   Zget_callexpr_kwargcallr   r;   r2   set_is_baser   ,scan_declarative_assignments_and_apply_typesZdefnr   basesZ
named_typer   ZNAMED_TYPE_BUILTINS_OBJECTr
   r   failZfallback_to_anyZadd_symbol_table_noder   r   )rN   rP   rU   Zcls_argobjr*   r*   r+   r'      s6   

r'   r   c                 C  s   | j jD ]b}t|tjrt|jtjr|jjdkr|j}nt|tjr+|jdkr+|}nqt|jt	r>| j
j|jj|dd}nq|rf|jrft|j}t|trZ|jj d|j |_qt| j
d|j |j qd S )NZas_declarative_baseZmappedT)Z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())rP   Z
decoratorsr;   r	   ZCallExprZcallee
MemberExprrS   exprr   rT   Zlookup_qualifiedr2   r   typer   r    r   r[   )rN   	decoratortargetr7   Zsym_typer*   r*   r+   r/      s<   








r/   c                 C  s   t |  t| jtjsJ | jj}t|tjrt|jtjs J t	|jj
}t|tr4t|j
tju s6J t| j| j d S r%   )rR   r;   reasonr	   r^   r_   ZRefExprr2   ZVarr   r`   r   r   r3   ZREGISTRYr   rY   rP   rT   )rN   r_   Z	node_typer*   r*   r+   r4      s   r4   c                 C  s>   t |  | j}t| j| t| jj tj|| jdd d S NTrQ   )	rR   rP   rV   rT   r   rX   rU   r   rY   )rN   rP   r*   r*   r+   r5      s   
r5   c                 C  s.   t |  t| jj tj| j| jdd d S rd   )rR   r   rX   rP   rU   r   rY   rT   rN   r*   r*   r+   r6     s
   

r6   c                 C  s   t | jj d S r%   )r   rX   rP   rU   re   r*   r*   r+   r9     s   r9   c                 C  s   t |  t| j| j d S r%   )rR   r   rY   rP   rT   re   r*   r*   r+   r<     s   r<   r   r   c                 C  s   | j S r%   )Zdefault_attr_typere   r*   r*   r+   r@     s   r@   .Union[ClassDefContext, DynamicClassDefContext]c                 C  s   t | ddd dS )z`Add __sa_DeclarativeMeta and __sa_Mapped symbol to the global space
    for all class defs

    rE   ZMappedZ__sa_MappedN)r   Z
add_globalre   r*   r*   r+   rR     s   rR   rT   r   
target_clsr   c                 C  s@   |j }| d}|d urt|jtsJ t|jg  |_|_d S )Nz'sqlalchemy.orm.decl_api.DeclarativeMeta)rU   Zlookup_fully_qualified_or_noner;   r2   r   r   Zdeclared_metaclassZmetaclass_type)rT   rg   rU   r7   r*   r*   r+   rV   '  s   rV   N)rK   r!   r"   rL   )rN   r   r"   rO   )rN   r   r"   rO   )rN   r   r"   r   )rN   rf   r"   rO   )rT   r   rg   r   r"   rO   )4__doc__
__future__r   typingr   r   r   r   r   Z
TypingTyper   Zmypyr	   Zmypy.mror
   r   Z
mypy.nodesr   r   r   r   r   r   r   r   Zmypy.pluginr   r   r   r   r   Z
mypy.typesr   r    r   r   r   
__import__ImportErrorr   rM   r'   r/   r4   r5   r6   r9   r<   r@   rR   rV   r*   r*   r*   r+   <module>   sd   

M

'
6





	