o
    Rc9%                     @   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_fullnameZDECLARATIVE_BASE_dynamic_class_hookselfr    r'   <D:\Flask\env\Lib\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_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_hook9   s   


z)SQLAlchemyPlugin.get_class_decorator_hookc                 C   r!   r"   )r   r#   Z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   Zhas_declarative_base_base_cls_hook)r&   r   r3   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)r>   zsqlalchemy.orm.decl_apir@   r'   )r&   r=   r'   r'   r(   get_additional_depso   s   z$SQLAlchemyPlugin.get_additional_deps)__name__
__module____qualname__strr   r   r   r)   r   r,   r4   r6   r9   r   r   r<   r   r   r   intrA   r'   r'   r'   r(   r   ,   sH    







r   versionr    c                 C   r*   r"   )r   )rG   r'   r'   r(   pluginx   s   rH   ctxNc                 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   r7   r.   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   )rI   rJ   rO   Z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 )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())rJ   Z
decoratorsr7   r   ZCallExprZcallee
MemberExprrM   exprr   rN   Zlookup_qualifiedr.   r   typer   r   r   rU   )rI   	decoratortargetr3   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"   )rL   r7   reasonr   rX   rY   ZRefExprr.   ZVarr   rZ   r   r   r/   ZREGISTRYr   rS   rJ   rN   )rI   rY   Z	node_typer'   r'   r(   r0      s   r0   c                 C   s>   t |  | j}t| j| t| jj tj|| jdd d S NTrK   )	rL   rJ   rP   rN   r   rR   rO   r   rS   )rI   rJ   r'   r'   r(   r1      s   
r1   c                 C   s.   t |  t| jj tj| j| jdd d S r^   )rL   r   rR   rJ   rO   r   rS   rN   rI   r'   r'   r(   r2      s
   

r2   c                 C   s   t | jj d S r"   )r   rR   rJ   rO   r_   r'   r'   r(   r5      s   r5   c                 C   s   t |  t| j| j d S r"   )rL   r   rS   rJ   rN   r_   r'   r'   r(   r8      s   r8   c                 C   s   | j S r"   )Zdefault_attr_typer_   r'   r'   r(   r;     s   r;   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

    r?   ZMappedZ__sa_MappedN)r   Z
add_globalr_   r'   r'   r(   rL     s   rL   rN   
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)rO   Zlookup_fully_qualified_or_noner7   r.   r   r   Zdeclared_metaclassZmetaclass_type)rN   r`   rO   r3   r'   r'   r(   rP     s   rP   )1__doc__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   r   rE   rH   r$   r+   r0   r1   r2   r5   r8   r;   rL   rP   r'   r'   r'   r(   <module>   s^   L'3	