U
    r\j"                  	   @   s  d dl 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, d d	l*m	Z	 d d#l*m-Z- d d$l*m.Z. d d%l*m/Z/ e0d&d' ej12d(D Z3e3d)kZ4ed*eeef d+Z5G d,d- d-Z6d.d/ Z7ee8edd0d1d2Z9ee8ee d3d4d5Z:ee8ee d3d6d7Z;edd8d9d:Z<edd8d;d<Z=ee>d8d=d>Z?ee>d8d?d@Z@edd8dAdBZAee>d8dCdDZBee%eee6  dEdFdGZCe	e!e8dHdIdJZeee6 ddKdLdMZDe%e8eddNdOdPZEee#e$f e8e8e8ddQdRdSZFedTdUee8deeeef  dVdWdXZGeee8ee
e5 dTf ee5 dVdYdXZGddUee8eee
e dTf  ee dVdZdXZGee ee d[d\d]ZHe%e	e	d^d_d`ZIee%ee dadbdcZJeedddedfZKdS )g    N)Any)Iterable)Iterator)List)Optional)overload)Tuple)Type)TypeVar)Union)version)format_type)ARG_POS)CallExpr)ClassDef)CLASSDEF_NO_INFO)Context)
Expression)IfStmt)JsonDict)
MemberExpr)NameExpr)	Statement)SymbolTableNode)TypeInfo)Options)ClassDefContext)DynamicClassDefContext)SemanticAnalyzerPluginInterface)deserialize_and_fixup_type)map_type_from_supertype)Instance)NoneType)TypeVarType)UnboundType)	UnionTypec                 C   s    g | ]}t d |rt|qS )z^\d+$)rematchint).0x r+   O/root/pica-gateway/venv/lib/python3.8/site-packages/sqlalchemy/ext/mypy/util.py
<listcomp>0   s      r-   .)      	_TArgType)boundc                   @   s^   e Zd Zeeeee eddddZe	dddZ
eddd	d
Zeee	ed dddZdS )SQLAlchemyAttributeN)namelinecolumntypinforeturnc                 C   s"   || _ || _|| _|| _|| _d S N)r4   r5   r6   typer8   )selfr4   r5   r6   r7   r8   r+   r+   r,   __init__9   s
    zSQLAlchemyAttribute.__init__)r9   c                 C   s$   | j s
t| j| j| j| j  dS )N)r4   r5   r6   r;   )r;   AssertionErrorr4   r5   r6   	serialize)r<   r+   r+   r,   r?   G   s    
zSQLAlchemyAttribute.serialize)sub_typer9   c                 C   s&   t | jtsdS t| j|| j| _dS )zxExpands type vars in the context of a subtype when an attribute is
        inherited from a generic super type.
        N)
isinstancer;   r#   r    r8   )r<   r@   r+   r+   r,   expand_typevar_from_subtypeP   s    z/SQLAlchemyAttribute.expand_typevar_from_subtype)r8   dataapir9   c                 C   s,   |  }t|d|}| f ||d|S )Nr;   )r7   r8   )copyr   pop)clsr8   rC   rD   r7   r+   r+   r,   deserializeY   s    zSQLAlchemyAttribute.deserialize)__name__
__module____qualname__strr(   r   r	   r   r=   r   r?   rB   classmethodr   rH   r+   r+   r+   r,   r3   8   s   		r3   c                 C   s   t td| S )Nz	^__.+?__$)boolr&   r'   )r4   r+   r+   r,   name_is_dundere   s    rO   )r8   keyrC   r9   c                 C   s   || j di |< d S NZ
sqlalchemymetadata
setdefault)r8   rP   rC   r+   r+   r,   _set_info_metadatai   s    rU   )r8   rP   r9   c                 C   s   | j di |d S rQ   )rS   get)r8   rP   r+   r+   r,   _get_info_metadatam   s    rW   c                 C   s0   | j r,| j D ]}t||}|d k	r|  S qd S r:   )mrorW   )r8   rP   baserS   r+   r+   r,   _get_info_mro_metadataq   s    


rZ   )r8   r9   c                 C   s   | j di  d S rQ   rR   r8   r+   r+   r,   establish_as_sqlalchemyz   s    r\   c                 C   s   t | dd d S Nis_baseTrU   r[   r+   r+   r,   set_is_base~   s    r`   c                 C   s   t | d}|dkS r]   rW   r8   r^   r+   r+   r,   get_is_base   s    
rc   c                 C   s   t | d}|dkS r]   )rZ   rb   r+   r+   r,   has_declarative_base   s    
rd   c                 C   s   t | dd d S NZ	has_tableTr_   r[   r+   r+   r,   set_has_table   s    rf   c                 C   s   t | d}|dkS re   ra   rb   r+   r+   r,   get_has_table   s    
rg   )r8   rD   r9   c                 C   sJ   t | d}|d krd S g }|D ]&}t| ||}||  || q|S )Nmapped_attributes)rW   r3   rH   rB   append)r8   rD   rh   
attributesrC   attrr+   r+   r,   get_mapped_attributes   s     
rl   )typ_optionsr9   c                 C   s   t rt| |S t| S d S r:   )mypy_14_mypy_format_type)rm   rn   r+   r+   r,   r      s    
r   )r8   rj   r9   c                 C   s   t | ddd |D  d S )Nrh   c                 S   s   g | ]}|  qS r+   )r?   )r)   	attributer+   r+   r,   r-      s     z)set_mapped_attributes.<locals>.<listcomp>r_   )r8   rj   r+   r+   r,   set_mapped_attributes   s
    rr   )rD   msgctxr9   c                 C   s   d| }|  ||S )Nz[SQLAlchemy Mypy plugin] %s)fail)rD   rs   rt   r+   r+   r,   ru      s    ru   )rt   modulesymbol_nameasnamer9   c                 C   s8   | j j| j j j}||kr4| j j| j| }|||< d S r:   )rD   modulesZ
cur_mod_idnames)rt   rv   rw   rx   module_globalsZ
lookup_symr+   r+   r,   
add_global   s    r|   .)
expr_types)callexprr4   r}   r9   c                C   s   d S r:   r+   r~   r4   r}   r+   r+   r,   get_callexpr_kwarg   s    r   c                C   s   d S r:   r+   r   r+   r+   r,   r      s    c                C   sT   z| j |}W n tk
r&   Y d S X | j| }t||d k	rB|nttfrP|S d S r:   )	arg_namesindex
ValueErrorargsrA   r   r   )r~   r4   r}   Zarg_idxkwargr+   r+   r,   r      s    
 )stmtsr9   c                 c   sX   | D ]N}t |trLt |jd trL|jd jdkrL|jd jD ]
}|V  q>q|V  qd S )Nr   ztyping.TYPE_CHECKING)rA   r   exprr   fullnamebody)r   stmtZsubstmtr+   r+   r,   flatten_typechecking   s    
r   )rD   r7   r9   c                    s   t |ts|S |jdkr>t t fdd|jD t g S  |j|}|dk	rt |trt |j	t
r|j	}t| fdd|jD S |S d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)r)   Ztyp_argrD   r+   r,   r-     s     z'unbound_to_instance.<locals>.<listcomp>Nc                    s$   g | ]}t |trt |n|qS r+   )rA   r$   r   )r)   argr   r+   r,   r-   %  s   )rA   r$   r4   r   r%   r   r"   lookup_qualifiedr   noder   r!   )rD   r7   r   Z
bound_typer+   r   r,   r      s4    	




r   )rG   rD   r9   c                 C   sD   | j tkr>|| j| }|d kr$d S |r4t|jts8t|jS | j S r:   )r8   r   r   r4   rA   r   r   r>   )rG   rD   symr+   r+   r,   info_for_cls0  s    
r   )r   r9   c                 C   s,   t d}d|_t|d}t|| gtgdgS )NZ__sa_Mappedz sqlalchemy.orm.attributes.MappedZ_empty_constructorZarg1)r   r   r   r   r   )r   Zcolumn_descriptorZmember_exprr+   r+   r,   expr_to_mapped_constructor=  s    
r   )Lr&   typingr   r   r   r   r   r   r   r	   Z
TypingTyper
   r   Zmypyr   Zmypy.messagesr   rp   Z
mypy.nodesr   r   r   r   r   r   r   r   r   r   r   r   r   Zmypy.optionsr   Zmypy.pluginr   r   r   Zmypy.plugins.commonr   Zmypy.typeopsr    Z
mypy.typesr!   r"   r#   r$   r%   tuple__version__splitZ_versro   r1   r3   rO   rL   rU   rW   rZ   r\   r`   rN   rc   rd   rf   rg   rl   rr   ru   r|   r   r   r   r   r   r+   r+   r+   r,   <module>   s   -	 
 

   1 