o
    =ao                     @   s  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# 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' e
d"eeef d#Z(G d$d% d%Z)d&ed'e*d(ed)d*fd+d,Z+d&ed'e*d)ee fd-d.Z,d&ed'e*d)ee fd/d0Z-d&ed)d*fd1d2Z.d&ed)e/fd3d4Z0d&ed)e/fd5d6Z1d&ed)d*fd7d8Z2d&ed)e/fd9d:Z3d&ed;ed)eee)  fd<d=Z4d&ed>ee) d)d*fd?d@Z5d;edAe*dBed)d*fdCdDZ6dBeeef dEe*dFe*dGe*d)d*f
dHdIZ7edJdKdLedMe*dNd*d)eeeef  fdOdPZ8edLedMe*dNee	e( dJf d)ee( fdQdPZ8d*dKdLedMe*dNeee	e dJf  d)ee fdRdPZ8dSee d)ee fdTdUZ9d;edVed)efdWdXZ:dYed;ed)ee fdZd[Z;d\ed)efd]d^Z<d*S )_    )Any)Iterable)Iterator)List)Optional)overload)Tuple)Type)TypeVar)Union)ARG_POS)CallExpr)ClassDef)CLASSDEF_NO_INFO)Context)
Expression)IfStmt)JsonDict)
MemberExpr)NameExpr)	Statement)SymbolTableNode)TypeInfo)ClassDefContext)DynamicClassDefContext)SemanticAnalyzerPluginInterface)deserialize_and_fixup_type)map_type_from_supertype)Instance)NoneType)TypeVarType)UnboundType)	UnionType	_TArgType)boundc                   @   sp   e Zd Zdedededee deddfdd	Zde	fd
dZ
deddfddZedede	dedd fddZdS )SQLAlchemyAttributenamelinecolumntypinforeturnNc                 C   s"   || _ || _|| _|| _|| _d S N)r&   r'   r(   typer*   )selfr&   r'   r(   r)   r*    r/   N/var/www/html/gps/gps/lib/python3.10/site-packages/sqlalchemy/ext/mypy/util.py__init__*   s
   
zSQLAlchemyAttribute.__init__c                 C   s$   | j sJ | j| j| j| j  dS )N)r&   r'   r(   r-   )r-   r&   r'   r(   	serialize)r.   r/   r/   r0   r2   8   s   
zSQLAlchemyAttribute.serializesub_typec                 C   s&   t | jtsdS t| j|| j| _dS )zoExpands type vars in the context of a subtype when an attribute is inherited
        from a generic super type.N)
isinstancer-   r    r   r*   )r.   r3   r/   r/   r0   expand_typevar_from_subtypeA   s   z/SQLAlchemyAttribute.expand_typevar_from_subtypedataapic                 C   s,   |  }t|d|}| d||d|S )Nr-   )r)   r*   r/   )copyr   pop)clsr*   r6   r7   r)   r/   r/   r0   deserializeI   s   zSQLAlchemyAttribute.deserialize)__name__
__module____qualname__strintr   r	   r   r1   r   r2   r5   classmethodr   r;   r/   r/   r/   r0   r%   )   s4    
	r%   r*   keyr6   r+   Nc                 C   s   || j di |< d S N
sqlalchemy)metadata
setdefault)r*   rB   r6   r/   r/   r0   _set_info_metadataU      rG   c                 C   s   | j di |d S rC   )rE   get)r*   rB   r/   r/   r0   _get_info_metadataY   rH   rJ   c                 C   s0   | j r| j D ]}t||}|d ur|  S qd S r,   )mrorJ   )r*   rB   baserE   r/   r/   r0   _get_info_mro_metadata]   s   

rM   c                 C      t | dd d S Nis_baseTrG   r*   r/   r/   r0   set_is_basef      rS   c                 C      t | d}|du S rO   rJ   r*   rP   r/   r/   r0   get_is_basej      
rX   c                 C   rU   rO   )rM   rW   r/   r/   r0   has_declarative_baseo   rY   rZ   c                 C   rN   N	has_tableTrQ   rR   r/   r/   r0   set_has_tablet   rT   r]   c                 C   rU   r[   rV   rW   r/   r/   r0   get_has_tablex   rY   r^   r7   c                 C   sJ   t | d}|d u rd S g }|D ]}t| ||}||  || q|S )Nmapped_attributes)rJ   r%   r;   r5   append)r*   r7   r_   
attributesr6   attrr/   r/   r0   get_mapped_attributes}   s   
rc   ra   c                 C   s   t | ddd |D  d S )Nr_   c                 S   s   g | ]}|  qS r/   )r2   ).0	attributer/   r/   r0   
<listcomp>   s    z)set_mapped_attributes.<locals>.<listcomp>rQ   )r*   ra   r/   r/   r0   set_mapped_attributes   s
   rg   msgctxc                 C   s   d| }|  ||S )Nz[SQLAlchemy Mypy plugin] %s)fail)r7   rh   ri   r/   r/   r0   rj      s   rj   modulesymbol_nameasnamec                 C   s<   | j j| j j j}||vr| j j| j| }|||< d S d S r,   )r7   modules
cur_mod_idnames)ri   rk   rl   rm   module_globals
lookup_symr/   r/   r0   
add_global   s   rs   .)
expr_typescallexprr&   rt   c                C      d S r,   r/   ru   r&   rt   r/   r/   r0   get_callexpr_kwarg   s   rx   c                C   rv   r,   r/   rw   r/   r/   r0   rx      s   c                C   sR   z| j |}W n
 ty   Y d S w | j| }t||d ur |nttfr'|S d S r,   )	arg_namesindex
ValueErrorargsr4   r   r   )ru   r&   rt   arg_idxkwargr/   r/   r0   rx      s   
stmtsc                 c   sZ    | D ]'}t |tr't |jd tr'|jd jdkr'|jd jD ]}|V  q q|V  qd S )Nr   ztyping.TYPE_CHECKING)r4   r   exprr   fullnamebody)r   stmtsubstmtr/   r/   r0   flatten_typechecking   s   r   r)   c                    s   t |ts|S |jdkrt t fdd|jD t g S  |j|}|durEt |trEt |j	t
rE|j	}t| fdd|jD S |S )zTake the UnboundType that we seem to get as the ret_type from a FuncDef
    and convert it into an Instance/TypeInfo kind of structure that seems
    to work as the left-hand type of an AssignmentStatement.

    r   c                    s   g | ]}t  |qS r/   )unbound_to_instance)rd   typ_argr7   r/   r0   rf      s    z'unbound_to_instance.<locals>.<listcomp>Nc                    s$   g | ]}t |trt |n|qS r/   )r4   r!   r   )rd   argr   r/   r0   rf     s    )r4   r!   r&   r   r"   r|   r   lookup_qualifiedr   noder   r   )r7   r)   r   
bound_typer/   r   r0   r      s4   
	



r   r:   c                 C   sD   | j tu r|| j| }|d u rd S |rt|jtsJ |jS | j S r,   )r*   r   r   r&   r4   r   r   )r:   r7   symr/   r/   r0   info_for_cls  s   
r   r   c                 C   s,   t d}d|_t|d}t|| gtgdgS )N__sa_Mappedz sqlalchemy.orm.attributes.Mapped_empty_constructorarg1)r   r   r   r   r   )r   column_descriptormember_exprr/   r/   r0   expr_to_mapped_constructor  s   
r   )=typingr   r   r   r   r   r   r   r	   
TypingTyper
   r   
mypy.nodesr   r   r   r   r   r   r   r   r   r   r   r   r   mypy.pluginr   r   r   mypy.plugins.commonr   mypy.typeopsr   
mypy.typesr   r   r    r!   r"   r#   r%   r?   rG   rJ   rM   rS   boolrX   rZ   r]   r^   rc   rg   rj   rs   rx   r   r   r   r   r/   r/   r/   r0   <module>   s    ,	







0
