a
    [g&                     @  sP  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 n e'y   Y n
0 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u rtS d S N)r   type_id_for_fullnameZDECLARATIVE_BASE_dynamic_class_hookselfr!    r(   h/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/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 r#   )_fill_in_decoratorsr&   r(   r(   r)   get_customize_class_mro_hookC   s    z-SQLAlchemyPlugin.get_customize_class_mro_hookc                 C  s\   |  |}|d urX|jd urXt|j}|tju r6tS |tjtjfv rJtS |tj	u rXt
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  s   t |t ju rtS d S 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#   )r-   
isinstancer.   r   r   Zhas_declarative_base_base_cls_hook)r'   r!   r3   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_hookr&   r(   r(   r)   get_attribute_hooks   s
    z#SQLAlchemyPlugin.get_attribute_hookr   zList[Tuple[int, str, int]])filer"   c                 C  s   g dS )N))
   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,   r4   r6   r9   r<   rA   r(   r(   r(   r)   r   ;   s   

r   r    zTypingType[SQLAlchemyPlugin])versionr"   c                 C  s   t S r#   )r   )rE   r(   r(   r)   plugin   s    rF   r   None)ctxr"   c                 C  s2  t |  t| jtg }| j| j|_tt || jj	}||_
t| j| tj| jdtfd}|durt|jtrt|j tj|jj| jdd t|jg g|_n| jtj}|g|_zt| W nB ty   t| jd| j | jtj}|g|_d|_Y n0 | 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   )rH   rI   rN   Zcls_argobjr(   r(   r)   r%      s4    
r%   r   c                 C  s   | 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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())rI   Z
decoratorsr7   r	   ZCallExprZcallee
MemberExprrL   exprr   rM   Zlookup_qualifiedr.   r   typer   r!   r   rT   )rH   	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rht|j
tju slJ t| j| j d S r#   )rK   r7   reasonr	   rW   rX   ZRefExprr.   ZVarr   rY   r   r   r/   ZREGISTRYr   rR   rI   rM   )rH   rX   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 NTrJ   )	rK   rI   rO   rM   r   rQ   rN   r   rR   )rH   rI   r(   r(   r)   r1      s    r1   c                 C  s.   t |  t| jj tj| j| jdd d S r]   )rK   r   rQ   rI   rN   r   rR   rM   rH   r(   r(   r)   r2     s
    
r2   c                 C  s   t | jj d S r#   )r   rQ   rI   rN   r^   r(   r(   r)   r5     s    r5   c                 C  s   t |  t| j| j d S r#   )rK   r   rR   rI   rM   r^   r(   r(   r)   r8     s    r8   r   r   c                 C  s   | j S r#   )Zdefault_attr_typer^   r(   r(   r)   r;     s    r;   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

    r?   ZMappedZ__sa_MappedN)r   Z
add_globalr^   r(   r(   r)   rK     s    rK   r   r   )rM   
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)rN   Zlookup_fully_qualified_or_noner7   r.   r   r   Zdeclared_metaclassZmetaclass_type)rM   r_   rN   r3   r(   r(   r)   rO   '  s    rO   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   rF   r%   r+   r0   r1   r2   r5   r8   r;   rK   rO   r(   r(   r(   r)   <module>   s`   	M'6	