o
    Šåg&  ã                   @  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$ ddl"m%Z% z	e&dƒ W e'd ƒ‚ e'yÂ   Y nw G d!d"„ d"eƒZ(dId'd(„Z)dJd,d-„Z*dKd/d0„Z+dKd1d2„Z,dKd3d4„Z-dKd5d6„Z.dKd7d8„Z/dKd9d:„Z0dLd=d>„Z1dMd@dA„Z2dNdFdG„Z3dHS )Oz"
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-stubszÙThe 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                   @  sR   e Zd Zddd„Zddd	„Zdd
d„Zddd„Zddd„Zddd„Zddd„Z	dS )ÚSQLAlchemyPluginÚfullnameÚstrÚreturnú2Optional[Callable[[DynamicClassDefContext], None]]c                 C  ó   t  |¡t ju r
tS d S ©N)r   Útype_id_for_fullnameÚDECLARATIVE_BASEÚ_dynamic_class_hook©Úselfr    © r+   úV/var/www/html/flaskapp/venv/lib/python3.10/site-packages/sqlalchemy/ext/mypy/plugin.pyÚget_dynamic_class_hook<   s   z'SQLAlchemyPlugin.get_dynamic_class_hookú+Optional[Callable[[ClassDefContext], None]]c                 C  ó   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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_hookH   s   

þ
z)SQLAlchemyPlugin.get_class_decorator_hookc                 C  r$   r%   )r   r&   Ú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%   )r2   Ú
isinstancer3   r   r   Úhas_declarative_baseÚ_base_cls_hook)r*   r    r<   r+   r+   r,   Úget_base_class_hooke   s   
ÿ
þ
ýz$SQLAlchemyPlugin.get_base_class_hookú,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_hookÚfiler   úList[Tuple[int, str, int]]c                 C  s   g d¢S )N))é
   úsqlalchemy.orméÿÿÿÿ)rL   zsqlalchemy.orm.attributesrN   )rL   zsqlalchemy.orm.decl_apirN   r+   )r*   rJ   r+   r+   r,   Úget_additional_deps}   s   z$SQLAlchemyPlugin.get_additional_depsN)r    r!   r"   r#   )r    r!   r"   r.   )r    r!   r"   rF   )rJ   r   r"   rK   )
Ú__name__Ú
__module__Ú__qualname__r-   r1   r>   rA   rE   rI   rO   r+   r+   r+   r,   r   ;   s    







r   Úversionr!   r"   úTypingType[SQLAlchemyPlugin]c                 C  r/   r%   )r   )rS   r+   r+   r,   Úpluginˆ   s   rU   Úctxr   ÚNonec                 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)Ú
expr_typesNT©Úis_mixin_scanz.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   rB   r3   Úset_is_baser   Ú,scan_declarative_assignments_and_apply_typesÚdefnr   ÚbasesÚ
named_typer   ÚNAMED_TYPE_BUILTINS_OBJECTr
   r   ÚfailÚfallback_to_anyÚadd_symbol_table_noder   r   )rV   rX   ra   Úcls_argÚobjr+   r+   r,   r(   Œ   s6   ÿ
ÿ
úr(   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	ƒr>| j
j|jj|dd�}nq|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Ú.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())rX   Ú
decoratorsrB   r	   ÚCallExprÚcalleeÚ
MemberExprr]   Úexprr   r^   Úlookup_qualifiedr3   r   Útyper   r    r   rk   )rV   Ú	decoratorÚtargetr<   Úsym_typer+   r+   r,   r0   ³   s<   

ÿþ
ÿ

ÿ



ýú€Õr0   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%   )r\   rB   Úreasonr	   rw   rx   ÚRefExprr3   ÚVarr   rz   r   r   r4   ÚREGISTRYr   rf   rX   r^   )rV   rx   Ú	node_typer+   r+   r,   r6   é   s   ÿr6   c                 C  s>   t | ƒ | j}t| j|ƒ t | jj¡ tj|| jdd� d S ©NTrZ   )	r\   rX   rb   r^   r   re   ra   r   rf   )rV   rX   r+   r+   r,   r9   ú   s   
ÿr9   c                 C  s.   t | ƒ t | jj¡ tj| j| jdd� d S rƒ   )r\   r   re   rX   ra   r   rf   r^   ©rV   r+   r+   r,   r;     s
   

ÿr;   c                 C  s   t  | jj¡ d S r%   )r   re   rX   ra   r„   r+   r+   r,   r@     s   r@   c                 C  s   t | ƒ t | j| j¡ d S r%   )r\   r   rf   rX   r^   r„   r+   r+   r,   rD     s   rD   r   r   c                 C  s   | j S r%   )Údefault_attr_typer„   r+   r+   r,   rH     s   rH   ú.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

    rM   ÚMappedÚ__sa_MappedN)r   Ú
add_globalr„   r+   r+   r,   r\     s   r\   r^   r   Ú
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)ra   Úlookup_fully_qualified_or_nonerB   r3   r   r   Údeclared_metaclassÚmetaclass_type)r^   rŠ   ra   r<   r+   r+   r,   rb   '  s   ÿrb   N)rS   r!   r"   rT   )rV   r   r"   rW   )rV   r   r"   rW   )rV   r   r"   r   )rV   r†   r"   rW   )r^   r   rŠ   r   r"   rW   )4Ú__doc__Ú
__future__r   Ú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   Ú
__import__ÚImportErrorr   rU   r(   r0   r6   r9   r;   r@   rD   rH   r\   rb   r+   r+   r+   r,   Ú<module>   sd   
ÿýÿ
M

'
6





	