o
    bq<                     @   s  d Z ddlZddlZddlmZ ddlmZmZmZm	Z	 ddlm
Z
 ddlmZ ddlmZ ddlmZmZ dd	lmZ d
dhZh dZdd Zdd Zd+d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d,ddZdd Zd,dd Zd!Zd"d# Z d,d$d%Z!d,d&d'Z"e#ej$eee e#ej$eee ej#ej%e d(d) d* e#ej%ee!e e#ej$ee"e dS )-z.Astroid hooks for the Python standard library.    N)dedent)MANAGERUseInferenceDefaultinference_tipInferenceError)	arguments)
exceptions)nodes)AstroidBuilderextract_node)util
NamedTupletyping.NamedTuple>   	enum.Enumenum.IntEnumenum.IntFlagEnumIntEnumIntFlagc                 C   sJ   | t ju rtzt| j|d}|t ju rt |W S  ty$   t w )Ncontext)r   Uninferabler   nextinferStopIterationr   )noder   value r   b/var/www/secure340b-portal/env/lib/python3.10/site-packages/astroid/brain/brain_namedtuple_enum.py_infer_first+   s   

r   c                    sd   d
 fdd	}| j  | j}|rdd |D ni |ddd}|dd	d}|r/|r/|j|fS t )Nc                    s<   t  | krt |  S |r|v rt| S d S d S N)lenr   positionZkey_nameargsr   Zfound_keywordsr   r   "_extract_namedtuple_arg_or_keyword9   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>C   s    z-_find_func_form_arguments.<locals>.<dictcomp>r   typenamer"      field_namesr    )r%   keywordsr   r   )r   r   r&   r.   namenamesr   r$   r   _find_func_form_arguments8   s   
r1   Fc           
   	      sP  zlt |  \}}z|jdd }W nW tyj   |s' fdd|jD }nAt|dr=t|jt	r= fdd|jD }n't|drbt
dd	 |jD rW fd
d|jD }n fdd|jD }nt|shtY nw W n ttjfyy   t w |p}d}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>[       z#infer_func_form.<locals>.<listcomp>itemsc                    s,   g | ]}t |d  tjrt|d   jqS r   )
isinstancer	   Constr   r   r6   r   r   r   r8   b   s    eltsc                 s   s    | ]	}t |tjV  qd S r    )r<   r	   Tupler6   r   r   r   	<genexpr>k       z"infer_func_form.<locals>.<genexpr>c                    s*   g | ]}t |tjrt|jd   jqS r;   )r<   r	   r?   r   r>   r   r6   r   r   r   r8   l   s    
c                    r4   r   r5   r6   r   r   r   r8   r   r9   r   	docstring)r1   r   replacesplitAttributeErrorr>   hasattrr<   r:   listallr   r   r   r	   ClassDefparentbasesappendZ	EmptyNodeattrnameZinstance_attrs)
r   Z	base_typer   enumr/   r0   
attributes
class_nodeattrZ	fake_noder   r   r   infer_func_formN   sP   




 
rR   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   rV   c                 C   s6   | j }t|tjr|j|kS t|tjr|j|kS dS NF)funcr<   r	   	AttributerM   Namer/   )r   r/   rX   r   r   r   _looks_like   s   

r[   
namedtupler/   r   c                    sR  t jd|  d}t| ||d\}}}tj| }ttd	 }zt|
|d| }W n ty9   d}Y nw |r@t|}ddd	 |D }	d
 d fdd	t|D }
tt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)r/   rJ   r   z*import collections; collections.namedtuplerenameF, c                 s   s    | ]	}d j |dV  qdS )z
{arg}=None)r'   Nformat)r(   r'   r   r   r   r@      rA   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 ))r/   indexNra   )r(   rd   r/   Z	field_defr   r   r@      s
    
ao  
class %(name)s(tuple):
    __slots__ = ()
    _fields = %(fields)r
    def _asdict(self):
        return self.__dict__
    @classmethod
    def _make(cls, iterable, new=tuple.__new__, len=len):
        return new(cls, iterable)
    def _replace(self, %(replace_args)s):
        return self
    def __getnewargs__(self):
        return tuple(self)
%(field_defs)s
    )r/   fields
field_defsreplace_argsr   _asdict_make_replace_fields)r	   rZ   rootrR   r   ZCallSiteZ	from_callr   r   r   Zinfer_argumentZ
bool_valuer   "_get_renamed_namedtuple_attributesjoin	enumerater
   r   string_buildbodylocalsiter)r   r   Ztuple_base_namerP   r/   rO   Z	call_siterX   r_   rh   rg   fakerQ   r   re   r   infer_named_tuple   sF   
rv   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   r@      s    z5_get_renamed_namedtuple_attributes.<locals>.<genexpr>r   rw   z_%d)
rG   rS   rp   rH   r)   	iskeywordisdigit
startswithaddr^   )r-   r0   seenir/   r   r   r   rn      s$   
rn   c                 C   s*   t d}t| ||ddd }t| gS )z1 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   rN   r   )r   rR   rt   instantiate_class)r   r   Z	enum_metarP   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              	   C   s  | j D ]}|tvr
q|  jdkr | S | j D ]\}}tdd |D r'qg }|d  }t|t	j
rJt|jd t	jrF|jd  }n|j}n
t|t	jrT|jg}d}t|t	j
r{t|jt	jrvt|jjtrqt|jj}n
|jj}n|j }g }|D ]A}tdj|jd| j |d}	d	|v r|	tj|jd
7 }	tt|	|j }
|j|
_|  D ]	}|g|
j|j< q||
  q|| j|< q | S | S )z Specific inference for enums. rN   c                 s   s    | ]
}t |tj V  qd S r    )r<   r	   Z
AssignName)r(   r   r   r   r   r@   4  s    z#infer_enum_class.<locals>.<genexpr>r   Na  
                class {name}({types}):
                    @property
                    def value(self):
                        return {return_value}
                    @property
                    def name(self):
                        return "{name}"
                r`   )r/   typesreturn_valuer   r]   ) rT   ENUM_BASE_NAMESrm   r/   rs   r:   anyZ	statementr<   r	   Assigntargetsr?   Zitered	AnnAssigntargetr   r=   strrepr	as_stringr   rb   ro   INT_FLAG_ADDITION_METHODSr
   r   rq   rJ   	mymethodsrL   r   )r   basenamelocalvaluesr   stmtZinferred_return_valueZnew_targetsr   Zclassdefru   methodr   r   r   infer_enum_class)  sX   
9


r   c                 C   sf   dd | j D }tdj| jd|d}t|}tt||}|  D ]	}|g|j	|j< q$t
|fS )z%Infer a subclass of typing.NamedTuplec                 S   s    g | ]}t |tjr|jjqS r   )r<   r	   r   r   r/   )r(   Z	annassignr   r   r   r8   q  s    
z1infer_typing_namedtuple_class.<locals>.<listcomp>zU
    from collections import namedtuple
    namedtuple({typename!r}, {fields!r})
    r2   r+   rf   )rr   r   rb   r/   ro   r   r   rv   r   rs   rt   )rP   r   Zannassigns_fieldscoder   Zgenerated_class_noder   r   r   r   infer_typing_namedtuple_classn  s   
r   c                 C   s   z	t | j }W n	 ty   tw | dkrtt| jdkr$tt| jd t	j
t	jfs2tg }| jd jD ] }t|t	j
t	jfsGtt|jdkrPt||jd   q:| jd  }|rmdd|}nd}tdj||d	} t| |S )
z$Infer a typing.NamedTuple(...) call.r      r,   r   z({},)r2   z''z namedtuple({typename}, {fields})r   )r   rX   r   r   r   qnamer!   r%   r<   r	   Listr?   r>   rL   r   rb   ro   r   rv   )r   r   rX   r0   eltr+   r-   r   r   r   infer_typing_namedtuple  s4   
r   c                 C   s   t dd | jD S )Nc                 s   s    | ]	}|t v r|V  qd S r    )r   )r(   r   r   r   r   r@     s    
z<lambda>.<locals>.<genexpr>)r   rT   )clsr   r   r   <lambda>  s    r   )	predicaterW   r    )&__doc__	functoolsr)   textwrapr   Zastroidr   r   r   r   r   r   r	   Zastroid.builderr
   r   r   rU   r   r   r1   rR   rV   r[   partialZ_looks_like_namedtupleZ_looks_like_enumZ_looks_like_typing_namedtuplerv   rn   r   r   r   r   r   Zregister_transformCallrI   r   r   r   r   <module>   sT   

?		
:
(
E
%