U
    ÌZj$  ã                   @   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$e%ee$ d œd!d"„Z&ed#d$œd%d&„Z'ed#d$œd'd(„Z(ed#d$œd)d*„Z)ed#d$œd+d,„Z*ed#d$œd-d.„Z+ed#d$œd/d0„Z,ed#d$œd1d2„Z-eed$œd3d4„Z.eeef d#d$œd5d6„Z/eed#d7œd8d9„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eeeegdf  dœdd„Zeeeegdf  dœdd„Z	eeeegdf  dœdd„Z
eeeegdf  dœd	d
„Zeeeegdf  dœdd„Zeeeegef  dœdd„Zeeeeeef  dœdd„ZdS )ÚSQLAlchemyPluginN)Ú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&   ú]/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/sqlalchemy/ext/mypy/plugin.pyÚget_dynamic_class_hook-   s    z'SQLAlchemyPlugin.get_dynamic_class_hookc                 C   s   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 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 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   s   t  |¡t jkrtS d S 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   r1   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)Úfiler    c                 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*   r2   r4   r7   r   r   r:   r   r   r   Úintr?   r&   r&   r&   r'   r   ,   s*   þþþþþþþr   )Úversionr    c                 C   s   t S r!   )r   )rE   r&   r&   r'   Úpluginx   s    rF   N)Ú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	r¨t|jtƒr¨t |j¡ tj|jj| jdd� t|jg ƒg|_n| j tj¡}|g|_z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©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   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   )rG   rH   rM   Zcls_argÚobjr&   r&   r'   r#   |   s<      ÿ  ÿ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	ƒsht
‚| jj|jj|dd�}|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Ú.zžClass 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())rH   Z
decoratorsr5   r   ZCallExprZcalleeÚ
MemberExprrK   Úexprr   ÚAssertionErrorrL   Zlookup_qualifiedr,   r   Útyper   r   r   rS   )rG   Ú	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 r!   )rJ   r5   Úreasonr   rV   rX   rW   ZRefExprr,   ZVarr   rY   r   r   r-   ZREGISTRYr   rQ   rH   rL   )rG   rW   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 ©NTrI   )	rJ   rH   rN   rL   r   rP   rM   r   rQ   )rG   rH   r&   r&   r'   r/   ç   s      ÿr/   c                 C   s.   t | ƒ t | jj¡ tj| j| jdd� d S r]   )rJ   r   rP   rH   rM   r   rQ   rL   ©rG   r&   r&   r'   r0   ô   s      ÿr0   c                 C   s   t  | jj¡ d S r!   )r   rP   rH   rM   r^   r&   r&   r'   r3   ü   s    r3   c                 C   s   t | ƒ t | j| j¡ d S r!   )rJ   r   rQ   rH   rL   r^   r&   r&   r'   r6      s    r6   c                 C   s   | j S r!   )Zdefault_attr_typer^   r&   r&   r'   r9     s    r9   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'   rJ     s    rJ   )rL   Ú
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)	rM   Zlookup_fully_qualified_or_noner5   r,   r   rX   r   Zdeclared_metaclassZmetaclass_type)rL   r_   rM   r1   r&   r&   r'   rN     s    ÿrN   )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   rC   rF   r#   r)   r.   r/   r0   r3   r6   r9   rJ   rN   r&   r&   r&   r'   Ú<module>   sV   L'3
 þ