HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //usr/local/lib/python3.10/dist-packages/sqlalchemy/ext/mypy/__pycache__/plugin.cpython-310.pyc
o

���g&�@sdZddlmZddlmZddlmZddlmZddlmZddlmZ	ddlm
Z
dd	lmZdd
l
mZddl
mZddlmZdd
lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlmZddl"m#Z#ddl"m$Z$ddl"m%Z%z	e&d�We'd ��e'y�YnwGd!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)�utilzsqlalchemy-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@sReZdZddd�Zddd	�Zdd
d�Zddd
�Zddd�Zddd�Zddd�Z	dS)�SQLAlchemyPlugin�fullname�str�return�2Optional[Callable[[DynamicClassDefContext], None]]cC�t�|�tjur
tSdS�N)r�type_id_for_fullname�DECLARATIVE_BASE�_dynamic_class_hook��selfr �r+�E/usr/local/lib/python3.10/dist-packages/sqlalchemy/ext/mypy/plugin.py�get_dynamic_class_hook<sz'SQLAlchemyPlugin.get_dynamic_class_hook�+Optional[Callable[[ClassDefContext], None]]cC�tSr%)�_fill_in_decoratorsr)r+r+r,�get_customize_class_mro_hookCsz-SQLAlchemyPlugin.get_customize_class_mro_hookcCs\|�|�}|dur,|jdur,t�|j�}|tjurtS|tjtjfvr%tS|tj	ur,t
SdSr%)�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_hookHs

�
z)SQLAlchemyPlugin.get_class_decorator_hookcCr$r%)rr&�DECLARATIVE_META�_metaclass_cls_hookr)r+r+r,�get_metaclass_hook[sz#SQLAlchemyPlugin.get_metaclass_hookcCs.|�|�}|rt|jt�rt�|j�rtSdSr%)r2�
isinstancer3rr�has_declarative_base�_base_cls_hook)r*r r<r+r+r,�get_base_class_hookes
�
�
�z$SQLAlchemyPlugin.get_base_class_hook�,Optional[Callable[[AttributeContext], Type]]cCs|�d�rtSdS)Nz-sqlalchemy.orm.attributes.QueryableAttribute.)�
startswith�_queryable_getattr_hookr)r+r+r,�get_attribute_hookss
�z#SQLAlchemyPlugin.get_attribute_hook�filer�List[Tuple[int, str, int]]cCsgd�S)N))�
�sqlalchemy.orm���)rLzsqlalchemy.orm.attributesrN)rLzsqlalchemy.orm.decl_apirNr+)r*rJr+r+r,�get_additional_deps}sz$SQLAlchemyPlugin.get_additional_depsN)r r!r"r#)r r!r"r.)r r!r"rF)rJrr"rK)
�__name__�
__module__�__qualname__r-r1r>rArErIrOr+r+r+r,r;s







r�versionr!r"�TypingType[SQLAlchemyPlugin]cCr/r%)r)rSr+r+r,�plugin�srU�ctxr�NonecCs0t|�t|jtg��}|j�|j�|_tt�||jj	�}||_
t|j|�tj
|jdtfd�}|durTt|jt�rTt�|j�tj|jj|jdd�t|jg�g|_n|j�tj�}|g|_zt|�Wn ty�t�|jd|j�|j�tj�}|g|_d|_Ynw|j�|jt t!|��t�|�dS)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 rr�
cur_mod_id�info�_set_declarative_metaclassr�get_callexpr_kwarg�callrrBr3�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_noderr)rVrXra�cls_arg�objr+r+r,r(�s6�
�
�r(rcCs�|jjD]b}t|tj�rt|jtj�r|jjdkr|j}nt|tj�r+|jdkr+|}nqt|jt	�r>|j
j|jj|dd�}nq|rf|jrft
|j�}t|t�rZ|jj�d|j��|_qt�|j
d|j|j�qdS)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�
decoratorsrBr	�CallExpr�callee�
MemberExprr]�exprrr^�lookup_qualifiedr3r�typerr rrk)rV�	decorator�targetr<�sym_typer+r+r,r0�s<

��
�

�



����r0cCs�t|�t|jtj�s
J�|jj}t|tj�rt|jtj�s J�t	|jj
�}t|t�r4t�
|j
�tjus6J�t�|j|j�dSr%)r\rB�reasonr	rwrx�RefExprr3�Varrrzrrr4�REGISTRYrrfrXr^)rVrx�	node_typer+r+r,r6�s�r6cCs>t|�|j}t|j|�t�|jj�tj||jdd�dS�NTrZ)	r\rXrbr^rrerarrf)rVrXr+r+r,r9�s
�r9cCs.t|�t�|jj�tj|j|jdd�dSr�)r\rrerXrarrfr^�rVr+r+r,r;s


�r;cCst�|jj�dSr%)rrerXrar�r+r+r,r@sr@cCst|�t�|j|j�dSr%)r\rrfrXr^r�r+r+r,rDsrDrrcCs|jSr%)�default_attr_typer�r+r+r,rHsrH�.Union[ClassDefContext, DynamicClassDefContext]cCst�|ddd�dS)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\sr\r^r�
target_clsr
cCs@|j}|�d�}|durt|jt�sJ�t|jg�|_|_dS)Nz'sqlalchemy.orm.decl_api.DeclarativeMeta)ra�lookup_fully_qualified_or_nonerBr3rr�declared_metaclass�metaclass_type)r^r�rar<r+r+r,rb's�rbN)rSr!r"rT)rVrr"rW)rVrr"rW)rVrr"r)rVr�r"rW)r^rr�r
r"rW)4�__doc__�
__future__r�typingrrrrr�
TypingTyper�mypyr	�mypy.mror
r�
mypy.nodesrr
rrrrrr�mypy.pluginrrrrr�
mypy.typesrr�rrr�
__import__�ImportErrorrrUr(r0r6r9r;r@rDrHr\rbr+r+r+r,�<module>sd
���
M

'
6