o
    gKR                     @   s  d Z ddlZddlZddlmZ ddlZddlmZmZmZm	Z	 ddl
mZmZ ddlmZmZmZmZmZ ddlmZ dd	hZh d
Zdd Zdd Zd1ddZdd Zdd ZejeddZejeddZejeddZd2ddZ dd Z!d3ddZ"d2dd Z#d!Z$d"d# Z%d2d$d%Z&d2d&d'Z'd2d(d)Z(d*ej)d+e*fd,d-Z+e ,ej-ee e e ,ej-ee#e e j,ej)e%e+d. e ,ej)ee&e e ,ej.ee'd/d0  e ,ej-ee(e dS )4z.Astroid hooks for the Python standard library.    N)dedent)	argumentsinference_tipnodesutil)AstroidBuilderextract_node)AstroidTypeErrorAstroidValueErrorInferenceErrorMroErrorUseInferenceDefault)AstroidManager
NamedTupletyping.NamedTuple>   	enum.Enumenum.IntEnumenum.IntFlagEnumIntEnumIntFlagc              
   C   sV   | t ju rtz
t| j|d}W n ty  } zt|d }~ww |t ju r)t |S )Ncontext)r   Uninferabler   nextinferStopIterationr   )noder   valueexc r    a/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/astroid/brain/brain_namedtuple_enum.py_infer_first9   s   

r"   c                    sf   	 d
 fdd	}| j  | j}|rdd |D ni |ddd}|dd	d}|r0|r0|j|fS t )Nc                    s<   t  | krt |  S |r|v rt| S d S d S N)lenr"   positionkey_nameargsr   found_keywordsr    r!   "_extract_namedtuple_arg_or_keywordF   s
   zE_find_func_form_arguments.<locals>._extract_namedtuple_arg_or_keywordc                 S   s   i | ]}|j |jqS r    )argr   ).0keywordr    r    r!   
<dictcomp>Q   s    z-_find_func_form_arguments.<locals>.<dictcomp>r   typenamer%      field_namesr#   )r)   keywordsr   r   )r   r   r+   r3   namenamesr    r(   r!   _find_func_form_argumentsE   s   
r6   Fc              
      s  zwt |  \}}z|jdd }W nb tyu } zV|s( fdd|jD }nCt|dr>t|jt	r> fdd|jD }n(t|drct
dd	 |jD rX fd
d|jD }n fdd|jD }nt||skt|W Y d}~nd}~ww W n ttfy } zt|d}~ww |sdd |D }dd |D }|pd}t|d}| j|_|j| |D ]}	t }
||
_|	|
_|
g|j|	< q|||fS )z<Specific inference function for namedtuple or Python 3 enum., c                       g | ]}t | jqS r    r"   r   r-   constr   r    r!   
<listcomp>i       z#infer_func_form.<locals>.<listcomp>itemsc                    s,   g | ]}t |d  tjrt|d   jqS r   )
isinstancer   Constr"   r   r;   r   r    r!   r=   p   s    eltsc                 s   s    | ]	}t |tjV  qd S r#   )rA   r   Tupler;   r    r    r!   	<genexpr>y   s    z"infer_func_form.<locals>.<genexpr>c                    s*   g | ]}t |tjrt|jd   jqS r@   )rA   r   rD   r"   rC   r   r;   r   r    r!   r=   z   s    
c                    r9   r    r:   r;   r   r    r!   r=      r>   Nc                 S   s   g | ]}t |qS r    )strr-   attrr    r    r!   r=      s    c                 S   s   g | ]}d |vr|qS )r8   r    rG   r    r    r!   r=      s    r   	docstring)r6   r   replacesplitAttributeErrorrC   hasattrrA   r?   listallr   r   r   ClassDefparentbasesappend	EmptyNodeattrnameinstance_attrs)r   	base_typer   enumr4   r5   
attributesr   
class_noderH   	fake_noder    r   r!   infer_func_form\   sX   




 
r\   c                 C   s   t | jt@ S )zQPredicate for class inference tip

    :type node: ClassDef
    :rtype: bool
    )set	basenamesTYPING_NAMEDTUPLE_BASENAMESr   r    r    r!   _has_namedtuple_base   s   ra   c                 C   s6   | j }t|tjr|j|kS t|tjr|j|kS dS NF)funcrA   r   	AttributerU   Namer4   )r   r4   rc   r    r    r!   _looks_like   s   

rf   
namedtupler4   r   c                    s  t jd|  d}t| ||d\}}}tjj| |d}td} zt| 	 }W n t
y9 } zt| d|d}~ww zt||d| }	W n tt
fyT   d}	Y nw zt|||	}W n) tyr }
 z	td	t|
 |
d}
~
w ty }
 z	td
t|
 |
d}
~
ww ddd |D }d d fddt|D }tt d| d|d| d| d	}|jd jd |jd< |jd jd |jd< |jd jd |jd< |jd jd |jd< |D ]}|jd j| |j|< qt|gS )z4Specific inference function for namedtuple Call nodetuple)r4   rQ   r   z*import collections; collections.namedtupler`   NrenameFzTypeError: zValueError: , c                 s   s    | ]}| d V  qdS )z=NoneNr    )r-   r,   r    r    r!   rE      s    z$infer_named_tuple.<locals>.<genexpr>z[    {name} = property(lambda self: self[{index:d}], doc='Alias for field number {index:d}')
c                 3   s"    | ]\}} j ||d V  qdS ))r4   indexN)format)r-   rm   r4   	field_defr    r!   rE      s
    
z
class z*(tuple):
    __slots__ = ()
    _fields = z
    def _asdict(self):
        return self.__dict__
    @classmethod
    def _make(cls, iterable, new=tuple.__new__, len=len):
        return new(cls, iterable)
    def _replace(self, zP):
        return self
    def __getnewargs__(self):
        return tuple(self)
z
    r   _asdict_make_replace_fields)r   re   rootr\   r   CallSite	from_callr   r   r   r   r   infer_argument
bool_value_check_namedtuple_attributesr	   r   rF   r
   join	enumerater   r   string_buildbodylocalsiter)r   r   tuple_base_namerZ   r4   rY   	call_siterc   erj   r   replace_args
field_defsfakerH   r    ro   r!   infer_named_tuple   sd   
	
r   c                 C   s|   t | }t }t| D ].\}}tdd |D r.t|s.|r.|d  s.|ds.||v r4d| ||< || qt	|S )Nc                 s   s     | ]}|  p|d kV  qdS )_N)isalnum)r-   cr    r    r!   rE          z5_get_renamed_namedtuple_attributes.<locals>.<genexpr>r   r   z_%d)
rN   r]   r|   rO   r.   	iskeywordisdigit
startswithaddri   )r2   r5   seenir4   r    r    r!   "_get_renamed_namedtuple_attributes   s"   
r   c                 C   s   t |}|r
t|}| f| D ]$}t|tstd| s'tdd| t|r3td|qt	 }|D ] }|
drI|sItd|||v rTtd||| q9|S )Nz*Type names and field names must be stringsz(Type names and field names must be validzidentifiers: z0Type names and field names cannot be a keyword: r   z-Field names cannot start with an underscore: z"Encountered duplicate field name: )ri   r   rA   rF   r	   isidentifierr
   r.   r   r]   r   r   )r0   rY   rj   r4   r   r    r    r!   rz     s2   

rz   c                 C   s*   t d}t| ||ddd }t| gS )z/Specific inference function for enum Call node.a  
    class EnumMeta(object):
        'docstring'
        def __call__(self, node):
            class EnumAttribute(object):
                name = ''
                value = 0
            return EnumAttribute()
        def __iter__(self):
            class EnumAttribute(object):
                name = ''
                value = 0
            return [EnumAttribute()]
        def __reversed__(self):
            class EnumAttribute(object):
                name = ''
                value = 0
            return (EnumAttribute, )
        def __next__(self):
            return next(iter(self))
        def __getitem__(self, attr):
            class Value(object):
                @property
                def name(self):
                    return ''
                @property
                def value(self):
                    return attr

            return Value()
        __members__ = ['']
    T)r   rX   r   )r   r\   r   instantiate_class)r   r   	enum_metarZ   r    r    r!   
infer_enum(  s
   "r   a  
    def __or__(self, other):
        return {name}(self.value | other.value)
    def __and__(self, other):
        return {name}(self.value & other.value)
    def __xor__(self, other):
        return {name}(self.value ^ other.value)
    def __add__(self, other):
        return {name}(self.value + other.value)
    def __div__(self, other):
        return {name}(self.value / other.value)
    def __invert__(self):
        return {name}(~self.value)
    def __mul__(self, other):
        return {name}(self.value * other.value)
c              	      s>  dd |   D D ]}|tvrq	|  jdkr | S i }t }| j D ]\}}tdd |D r3q%|d  }t	|t
jrTt	|jd t
jrP|jd  }n|j}nt	|t
jr_|jg}nq%d}t	|t
jrt	|jt
jrt	|jjtr}t|jj}n
|jj}n|j }g }	|D ]U}
t	|
t
jrq||
j tdj|
jd| j|d	}d
|v r|tj|
jd7 }tt dd||
j }|
j |_ | ! D ]	}|g|j|j< q|	"|#  |||< q|	| j|< q%t
j$| d  % fdd| D   g| jd< d|vrtd}tt |d }|g| jd<  | S | S )zSpecific inference for enums.c                 s   s     | ]}|j D ]}|V  qqd S r#   )r^   )r-   clsbr    r    r!   rE   d  r   z#infer_enum_class.<locals>.<genexpr>rX   c                 s   s    | ]
}t |tj V  qd S r#   )rA   r   
AssignName)r-   r   r    r    r!   rE   m  s    r   Na  
                class {name}({types}):
                    @property
                    def value(self):
                        return {return_value}
                    @property
                    def name(self):
                        return "{name}"
                rk   )r4   typesreturn_valuer   rh   F)apply_transformsrQ   c                    s.   g | ]\}}t j| d t j|j d fqS )r   )r   rB   re   r4   )r-   kvmembersr    r!   r=     s    z$infer_enum_class.<locals>.<listcomp>__members__r4   zY
            @property
            def name(self):
                return ''
            )&mroENUM_BASE_NAMESru   r4   r]   r   r?   any	statementrA   r   AssigntargetsrD   itered	AnnAssigntargetr   rB   rF   repr	as_stringStarredr   r   rn   r{   r^   INT_FLAG_ADDITION_METHODSr   r   r}   rQ   	mymethodsrS   r   Dictpostinit)r   basenamedunder_memberstarget_nameslocalvaluesstmtr   inferred_return_valuenew_targetsr   classdefr   methodcodename_dynamicclassattrr    r   r!   infer_enum_classb  s   a







r   c              
   C   s   dd | j D }tdj| jd|d}t|}z	tt||}W n ty5 } zt	||d|d}~ww | 
 D ]	}|g|j|j< q:| j D ]'}t|tjra|jD ]}	|	j}
| j|
 |j|
< qRqGt|tjrn|g|j|j< qGt|fS )z%Infer a subclass of typing.NamedTuplec                 S   s    g | ]}t |tjr|jjqS r    )rA   r   r   r   r4   )r-   	annassignr    r    r!   r=     s    
z1infer_typing_namedtuple_class.<locals>.<listcomp>zU
    from collections import namedtuple
    namedtuple({typename!r}, {fields!r})
    r7   )r0   fields)r   r   N)r~   r   rn   r4   r{   r   r   r   r   r   r   r   rA   r   r   r   rP   r   )rZ   r   annassigns_fieldsr   r   generated_class_noder   r   	body_noder   rH   r    r    r!   infer_typing_namedtuple_class  s6   


r   c                 C   s   t d}||S )z
    Starting with python3.9, NamedTuple is a function of the typing module.
    The class NamedTuple is build dynamically through a call to `type` during
    initialization of the `_NamedTuple` variable.
    zD
        from typing import _NamedTuple
        _NamedTuple
        )r   r   )r   r   klassr    r    r!    infer_typing_namedtuple_function  s   
r   c              
   C   s  z	t | j }W n ttfy } zt|d}~ww | dkr#tt| jdkr,tt	| jd t
jt
jfs:tg }| jd jD ] }t	|t
jt
jfsOtt|jdkrXt||jd   qB| jd  }|rvdd| d}nd	}td
| d| d} t| |S )z$Infer a typing.NamedTuple(...) call.Nr      r1   r   (r7   z,)z''znamedtuple(rk   ))r   rc   r   r   r   r   qnamer$   r)   rA   r   ListrD   rC   rS   r   r{   r   r   )r   r   rc   r   r5   eltr0   r2   r    r    r!   infer_typing_namedtuple  s2   
r   r   returnc                 C   s.   zt dd |  D W S  ty   Y dS w )z,Return whether cls is a subclass of an Enum.c                 s   s.    | ]}|j tv ot| d ddkV  qdS )r4   NrX   )r4   r   getattrru   )r-   r   r    r    r!   rE   #  s    

z$_is_enum_subclass.<locals>.<genexpr>F)r   r   r   )r   r    r    r!   _is_enum_subclass   s   
r   )	predicatec                 C   s   | j dkot|  dd dkS )Nr   r4   typing)r4   r   ru   r`   r    r    r!   <lambda>;  s   
 r   rb   r#   )F)/__doc__	functoolsr.   textwrapr   astroidr   r   r   r   astroid.builderr   r   astroid.exceptionsr	   r
   r   r   r   astroid.managerr   r_   r   r"   r6   r\   ra   rf   partial_looks_like_namedtuple_looks_like_enum_looks_like_typing_namedtupler   r   rz   r   r   r   r   r   r   rP   boolr   register_transformCallFunctionDefr    r    r    r!   <module>   sb   

F		
=

!(
k
!
#