o
    g&                     @  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_fullnameDECLARATIVE_BASE_dynamic_class_hookselfr     r+   \/var/www/html/ecg_monitoring/venv/lib/python3.10/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_nodeMAPPED_DECORATOR_cls_decorator_hookAS_DECLARATIVEAS_DECLARATIVE_BASE_base_cls_decorator_hookDECLARATIVE_MIXIN_declarative_mixin_hook)r*   r    symtype_idr+   r+   r,   get_class_decorator_hookH   s   


z)SQLAlchemyPlugin.get_class_decorator_hookc                 C  r$   r%   )r   r&   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%   )r2   
isinstancer3   r   r   has_declarative_base_base_cls_hook)r*   r    r<   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)rL   zsqlalchemy.orm.attributesrN   )rL   zsqlalchemy.orm.decl_apirN   r+   )r*   rJ   r+   r+   r,   get_additional_deps}   s   z$SQLAlchemyPlugin.get_additional_depsN)r    r!   r"   r#   )r    r!   r"   r.   )r    r!   r"   rF   )rJ   r   r"   rK   )
__name__
__module____qualname__r-   r1   r>   rA   rE   rI   rO   r+   r+   r+   r,   r   ;   s    







r   versionr!   r"   TypingType[SQLAlchemyPlugin]c                 C  r/   r%   )r   )rS   r+   r+   r,   plugin   s   rU   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)
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   rB   r3   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   )rV   rX   ra   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 )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())rX   
decoratorsrB   r	   CallExprcallee
MemberExprr]   exprr   r^   lookup_qualifiedr3   r   typer   r    r   rk   )rV   	decoratortargetr<   sym_typer+   r+   r,   r0      s<   








r0   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%   )r\   rB   reasonr	   rw   rx   RefExprr3   Varr   rz   r   r   r4   REGISTRYr   rf   rX   r^   )rV   rx   	node_typer+   r+   r,   r6      s   r6   c                 C  s>   t |  | j}t| j| t| jj tj|| jdd d S NTrZ   )	r\   rX   rb   r^   r   re   ra   r   rf   )rV   rX   r+   r+   r,   r9      s   
r9   c                 C  s.   t |  t| jj tj| j| jdd d S r   )r\   r   re   rX   ra   r   rf   r^   rV   r+   r+   r,   r;     s
   

r;   c                 C  s   t | jj d S r%   )r   re   rX   ra   r   r+   r+   r,   r@     s   r@   c                 C  s   t |  t| j| j d S r%   )r\   r   rf   rX   r^   r   r+   r+   r,   rD     s   rD   r   r   c                 C  s   | j S r%   )default_attr_typer   r+   r+   r,   rH     s   rH   .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

    rM   Mapped__sa_MappedN)r   
add_globalr   r+   r+   r,   r\     s   r\   r^   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)ra   lookup_fully_qualified_or_nonerB   r3   r   r   declared_metaclassmetaclass_type)r^   r   ra   r<   r+   r+   r,   rb   '  s   rb   N)rS   r!   r"   rT   )rV   r   r"   rW   )rV   r   r"   rW   )rV   r   r"   r   )rV   r   r"   rW   )r^   r   r   r   r"   rW   )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   rU   r(   r0   r6   r9   r;   r@   rD   rH   r\   rb   r+   r+   r+   r,   <module>   sd   

M

'
6





	