o
    =a$                     @   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# G dd deZ$d e%d!ee$ fd"d#Z&d$ed!d%fd&d'Z'd$ed!d%fd(d)Z(d$ed!d%fd*d+Z)d$ed!d%fd,d-Z*d$ed!d%fd.d/Z+d$ed!d%fd0d1Z,d$ed!d%fd2d3Z-d$ed!efd4d5Z.d$eeef d!d%fd6d7Z/d8ed9ed!d%fd:d;Z0d%S )<z"
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                   @   s   e Zd Zdedeeegdf  fddZdedeeegdf  fddZ	dedeeegdf  fdd	Z
dedeeegdf  fd
dZdedeeegdf  fddZdedeeegef  fddZdedeeeeef  fddZdS )SQLAlchemyPluginfullnamereturnNc                 C      t |t ju r
tS d S N)r   type_id_for_fullnameDECLARATIVE_BASE_dynamic_class_hookselfr    r(   P/var/www/html/gps/gps/lib/python3.10/site-packages/sqlalchemy/ext/mypy/plugin.pyget_dynamic_class_hook-   s   z'SQLAlchemyPlugin.get_dynamic_class_hookc                 C      t S r"   )_fill_in_decoratorsr&   r(   r(   r)   get_customize_class_mro_hook4   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_hook9   s   


z)SQLAlchemyPlugin.get_class_decorator_hookc                 C   r!   r"   )r   r#   DECLARATIVE_META_metaclass_cls_hookr&   r(   r(   r)   get_metaclass_hookM   s   z#SQLAlchemyPlugin.get_metaclass_hookc                 C   s.   |  |}|rt|jtrt|jrtS d S r"   )r.   
isinstancer/   r   r   has_declarative_base_base_cls_hook)r'   r   r8   r(   r(   r)   get_base_class_hookW   s   


z$SQLAlchemyPlugin.get_base_class_hookc                 C   s   | drtS d S )Nz-sqlalchemy.orm.attributes.QueryableAttribute.)
startswith_queryable_getattr_hookr&   r(   r(   r)   get_attribute_hooke   s
   z#SQLAlchemyPlugin.get_attribute_hookfilec                 C   s   ddgS )N)
   sqlalchemy.orm.attributes)rF   zsqlalchemy.orm.decl_apirH   r(   )r'   rE   r(   r(   r)   get_additional_depso   s   z$SQLAlchemyPlugin.get_additional_deps)__name__
__module____qualname__strr   r   r   r*   r   r-   r:   r=   rA   r   r   rD   r   r   r   intrI   r(   r(   r(   r)   r   ,   sH    







r   versionr    c                 C   r+   r"   )r   )rO   r(   r(   r)   pluginx   s   rP   ctxNc                 C   s,  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d}|g|_zt| W n ty   t| jd| j | jd}|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__builtins__.objectz.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   r>   r/   set_is_baser   ,scan_declarative_assignments_and_apply_typesdefnr   bases
named_typer	   r
   failfallback_to_anyadd_symbol_table_noder   r   )rQ   rR   r[   cls_argobjr(   r(   r)   r%   |   s6   

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	s4J | j
j|jj|dd}|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())rR   
decoratorsr>   r   CallExprcallee
MemberExprrW   exprr   rX   lookup_qualifiedr/   r   typer   r   r   rd   )rQ   	decoratortargetr8   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"   )rV   r>   reasonr   rp   rq   RefExprr/   Varr   rs   r   r   r0   REGISTRYr   r`   rR   rX   )rQ   rq   	node_typer(   r(   r)   r2      s   r2   c                 C   s>   t |  | j}t| j| t| jj tj|| jdd d S NTrT   )	rV   rR   r\   rX   r   r_   r[   r   r`   )rQ   rR   r(   r(   r)   r5      s   
r5   c                 C   s.   t |  t| jj tj| j| jdd d S r|   )rV   r   r_   rR   r[   r   r`   rX   rQ   r(   r(   r)   r7      s
   

r7   c                 C   s   t | jj d S r"   )r   r_   rR   r[   r}   r(   r(   r)   r<      s   r<   c                 C   s   t |  t| j| j d S r"   )rV   r   r`   rR   rX   r}   r(   r(   r)   r@      s   r@   c                 C   s   | j S r"   )default_attr_typer}   r(   r(   r)   rC     s   rC   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

    rG   Mapped__sa_MappedN)r   
add_globalr}   r(   r(   r)   rV     s   rV   rX   
target_clsc                 C   s@   |j }| d}|d urt|jtsJ t|jg  |_|_d S )Nz'sqlalchemy.orm.decl_api.DeclarativeMeta)r[   lookup_fully_qualified_or_noner>   r/   r   r   declared_metaclassmetaclass_type)rX   r   r[   r8   r(   r(   r)   r\     s   r\   )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   rM   rP   r%   r,   r2   r5   r7   r<   r@   rC   rV   r\   r(   r(   r(   r)   <module>   s^   L'3	