B
    fE'                 @  sR  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% ye&d W n e'k
r   Y n
X e'd G d!d" d"eZ(d#d$d%d&d'Z)d(d)d*d+d,Z*d-d)d*d.d/Z+d-d)d*d0d1Z,d-d)d*d2d3Z-d-d)d*d4d5Z.d-d)d*d6d7Z/d-d)d*d8d9Z0d:d;d*d<d=Z1d>d)d*d?d@Z2dAdBd)dCdDdEZ3dFS )Gz"
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               @  s|   e Zd ZdddddZdddddZdddd	d
ZdddddZdddddZdddddZdddddZ	dS )SQLAlchemyPluginstrz2Optional[Callable[[DynamicClassDefContext], None]])fullnamereturnc             C  s   t |t jkrtS d S )N)r   type_id_for_fullnameZDECLARATIVE_BASE_dynamic_class_hook)selfr!    r&   \C:\Users\Lenovo\AppData\Local\Temp\pip-unpacked-wheel-4nia5yor\sqlalchemy\ext\mypy\plugin.pyget_dynamic_class_hook<   s    z'SQLAlchemyPlugin.get_dynamic_class_hookz+Optional[Callable[[ClassDefContext], None]]c             C  s   t S )N)_fill_in_decorators)r%   r!   r&   r&   r'   get_customize_class_mro_hookC   s    z-SQLAlchemyPlugin.get_customize_class_mro_hookc             C  s\   |  |}|d k	rX|jd k	rXt|j}|tjkr6tS |tjtjfkrJtS |tj	krXt
S d S )N)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  s   t |t jkrtS d S )N)r   r#   ZDECLARATIVE_META_metaclass_cls_hook)r%   r!   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 )N)r+   
isinstancer,   r   r   Zhas_declarative_base_base_cls_hook)r%   r!   r1   r&   r&   r'   get_base_class_hooke   s    
z$SQLAlchemyPlugin.get_base_class_hookz,Optional[Callable[[AttributeContext], Type]]c             C  s   | drtS d S )Nz-sqlalchemy.orm.attributes.QueryableAttribute.)
startswith_queryable_getattr_hook)r%   r!   r&   r&   r'   get_attribute_hooks   s    z#SQLAlchemyPlugin.get_attribute_hookr   zList[Tuple[int, str, int]])filer"   c             C  s
   dddgS )N)
   zsqlalchemy.orm)r<   zsqlalchemy.orm.attributesr=   )r<   zsqlalchemy.orm.decl_apir=   r&   )r%   r;   r&   r&   r'   get_additional_deps}   s    z$SQLAlchemyPlugin.get_additional_depsN)
__name__
__module____qualname__r(   r*   r2   r4   r7   r:   r>   r&   r&   r&   r'   r   ;   s   

r   r    zTypingType[SQLAlchemyPlugin])versionr"   c             C  s   t S )N)r   )rB   r&   r&   r'   plugin   s    rC   r   None)ctxr"   c             C  s4  t |  t| jtg }| j| j|_tt || jj	}||_
t| j| tj| jdtfd}|dk	rt|jtrt|j tj|jj| jdd t|jg g|_n| jtj}|g|_yt| W nD tk
r   t| jd| j | jtj}|g|_d|_Y nX | j| jt t!| t| dS )zZGenerate a declarative Base class when the declarative_base() function
    is encountered.cls)Z
expr_typesNT)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   r5   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   )rE   rF   rK   Zcls_argobjr&   r&   r'   r$      s0    r$   r   c             C  s   x| j jD ]}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
|r
|jr
t|j}t|tr|jj d|j |_q
t| j
d|j |j q
W 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())rF   Z
decoratorsr5   r	   ZCallExprZcallee
MemberExprrI   exprr   rJ   Zlookup_qualifiedr,   r   typer   r!   r   rQ   )rE   	decoratortargetr1   Zsym_typer&   r&   r'   r)      s,    





r)   c             C  s   t |  t| jtjst| jj}t|tjr<t|jtj	s@tt
|jj}t|trht|jtjksltt| j| j d S )N)rH   r5   reasonr	   rT   AssertionErrorrU   ZRefExprr,   ZVarr   rV   r   r   r-   ZREGISTRYr   rO   rF   rJ   )rE   rU   Z	node_typer&   r&   r'   r.      s    
r.   c             C  s>   t |  | j}t| j| t| jj tj|| jdd d S )NT)rG   )	rH   rF   rL   rJ   r   rN   rK   r   rO   )rE   rF   r&   r&   r'   r/      s    r/   c             C  s.   t |  t| jj tj| j| jdd d S )NT)rG   )rH   r   rN   rF   rK   r   rO   rJ   )rE   r&   r&   r'   r0     s    r0   c             C  s   t | jj d S )N)r   rN   rF   rK   )rE   r&   r&   r'   r3     s    r3   c             C  s   t |  t| j| j d S )N)rH   r   rO   rF   rJ   )rE   r&   r&   r'   r6     s    r6   r   r   c             C  s   | j S )N)Zdefault_attr_type)rE   r&   r&   r'   r9     s    r9   z.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

    zsqlalchemy.ormZMappedZ__sa_MappedN)r   Z
add_global)rE   r&   r&   r'   rH     s    rH   r   r   )rJ   
target_clsr"   c             C  s@   |j }| d}|d k	r$t|jts(tt|jg  |_|_d S )Nz'sqlalchemy.orm.decl_api.DeclarativeMeta)	rK   Zlookup_fully_qualified_or_noner5   r,   r   rZ   r   Zdeclared_metaclassZmetaclass_type)rJ   r[   rK   r1   r&   r&   r'   rL   '  s
    rL   N)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   rC   r$   r)   r.   r/   r0   r3   r6   r9   rH   rL   r&   r&   r&   r'   <module>   s^   M'6	