3
%^j=                 @   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ddddddh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d0dd Zd!d" Zd1d#d$Zd%Zd&d' Z d2d(d)Z!d3d*d+Z"ej#ej$eee ej#ej$eee ej#ej%e d,d- d. ej#ej%ee!e ej#ej$ee"e dS )4z.Astroid hooks for the Python standard library.    N)dedent)MANAGERUseInferenceDefaultinference_tipInferenceError)	arguments)
exceptions)nodes)AstroidBuilderextract_node)utilZ
NamedTupleztyping.NamedTupleEnumIntEnumz	enum.Enumzenum.IntEnumIntFlagzenum.IntFlagc             C   sX   | t jkrty*t| j|d}|t jkr2t n|S W n tk
rR   t Y nX d S )N)context)r   Uninferabler   nextinferStopIterationr   )noder   value r   F/tmp/pip-build-8app2_gc/astroid/astroid/brain/brain_namedtuple_enum.py_infer_first+   s    

r   c                sh   d
 fdd	}| j  | j}|r0dd |D ni |ddd}|dd	d}|r^|r^|j|fS t d S )Nc                s8   t  | krt |  S |r4|kr4t| S d S )N)lenr   )positionkey_name)argsr   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   )r   arg).0keywordr   r   r   
<dictcomp>C   s    z-_find_func_form_arguments.<locals>.<dictcomp>r   typename)r   r      field_names)N)r   keywordsr   r   )r   r   r   r'   namenamesr   )r   r   r   r   _find_func_form_arguments8   s    
r*   Fc       
         s`  yt |  \}}y|jjddj }W n tk
r   |sP fdd|jD }nt|dr|t|jt	r| fdd|jD }nNt|drt
dd	 |jD r fd
d|jD }qʇ fdd|jD }nt|stY nX W n  ttjfk
r   t Y nX |pd}tj|d}| j|_|jj| x.|D ]&}tj }	||	_||	_|	g|j|< q,W |||fS )z=Specific inference function for namedtuple or Python 3 enum. , c                s   g | ]}t | jqS r   )r   r   )r!   const)r   r   r   
<listcomp>\   s    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   r.   c   s   eltsc             s   s   | ]}t |tjV  qd S )N)r0   r	   Tuple)r!   r-   r   r   r   	<genexpr>k   s    z"infer_func_form.<locals>.<genexpr>c                s*   g | ]"}t |tjrt|jd   jqS )r   )r0   r	   r3   r   r2   r   )r!   r-   )r   r   r   r.   m   s   c                s   g | ]}t | jqS r   )r   r   )r!   r-   )r   r   r   r.   s   s    r   Z	docstring)r*   r   replacesplitAttributeErrorr2   hasattrr0   r/   listallr   r   r   r	   ClassDefparentbasesappendZ	EmptyNodeattrnameZinstance_attrs)
r   Z	base_typer   enumr(   r)   
attributes
class_nodeattrZ	fake_noder   )r   r   infer_func_formN   s<    




rD   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    rH   c             C   s6   | j }t|tjr|j|kS t|tjr2|j|kS dS )NF)funcr0   r	   	Attributer?   Namer(   )r   r(   rI   r   r   r   _looks_like   s    

rL   
namedtuple)r(   c                sZ  t jd| j d}t| ||d\}}}tjj| }ttdj	 }yt|j
|d|j }W n tk
rt   d}Y nX |rt|}djdd	 |D }	d
 dj fdd	t|D }
ttj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< x$|D ]}|jd j| |j|< q0W t|gS )z4Specific inference function for namedtuple Call nodetuple)r(   r<   )r   z*import collections; collections.namedtuplerenameFz, c             s   s   | ]}d j |dV  qdS )z
{arg}=None)r    N)format)r!   r    r   r   r   r4      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 ))r(   indexN)rP   )r!   rR   r(   )	field_defr   r   r4      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	   rK   rootrD   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_namerB   r(   rA   Z	call_siterI   rO   rV   rU   fakerC   r   )rS   r   infer_named_tuple   s:    


rd   c             C   s   t | }t }xlt| D ]`\}}tdd |D  sbtj|sb| sb|d j sb|jdsb||krnd| ||< |j| qW t	|S )Nc             s   s   | ]}|j  p|d kV  qdS )_N)isalnum)r!   cr   r   r   r4      s    z5_get_renamed_namedtuple_attributes.<locals>.<genexpr>r   re   z_%d)
r9   rE   r^   r:   r"   	iskeywordisdigit
startswithaddrN   )r&   r)   seenir(   r   r   r   r\      s    

r\   c             C   s*   t d}t| ||ddd }t|j 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   r@   r   )r   rD   rb   instantiate_class)r   r   Z	enum_metarB   r   r   r   
infer_enum   s     ro   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  x| j D ]}|tkrq
| j jdkr*P xx| jj D ]h\}}tdd |D rVq8g }|d j }t|t	j
rt|jd t	jr|jd j }q|j}nt|t	jr|jg}d}t|t	j
rt|jt	jrt|jjtrt|jj}q|jj}n
|jj }g }x|D ]}tdj|jdj| j |d}	d	|krF|	tj|jd
7 }	ttj|	|j }
|j|
_x | j D ]}|g|
j|j< qlW |j|
j  qW || j|< q8W P q
W | S )z Specific inference for enums. r@   c             s   s   | ]}t |tj V  qd S )N)r0   r	   Z
AssignName)r!   r   r   r   r   r4   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}"
                z, )r(   typesZreturn_valuer   )r(   ) rF   ENUM_BASE_NAMESr[   r(   ra   r/   anyZ	statementr0   r	   Assigntargetsr3   Zitered	AnnAssigntargetr   r1   strrepr	as_stringr   rP   r]   INT_FLAG_ADDITION_METHODSr
   r   r_   r<   	mymethodsr>   rn   )r   basenamelocalvaluesrt   stmtZinferred_return_valueZnew_targetsrv   Zclassdefrc   methodr   r   r   infer_enum_class)  sP    


	


r   c       
      C   s   dd | j D }tdj| jdj|d}t|}tt||}x| j D ]}|g|j	|j< qJW xB| j D ]8}t
|tjszqhx$|jD ]}|j}	| j	|	 |j	|	< qW qhW t|fS )z%Infer a subclass of typing.NamedTuplec             S   s    g | ]}t |tjr|jjqS r   )r0   r	   ru   rv   r(   )r!   Z	annassignr   r   r   r.   r  s   z1infer_typing_namedtuple_class.<locals>.<listcomp>zU
    from collections import namedtuple
    namedtuple({typename!r}, {fields!r})
    r+   )r$   rT   )r`   r   rP   r(   r]   r   r   rd   r{   ra   r0   r	   rs   rt   rb   )
rB   r   Zannassigns_fieldscoder   Zgenerated_class_noder   Zassignrv   rC   r   r   r   infer_typing_namedtuple_classn  s     
r   c             C   s  yt | jj }W n tk
r*   tY nX |j dkr<tt| jdkrNtt| jd t	j
t	jfsjtg }xP| jd jD ]@}t|t	j
t	jfstt|jdkrt|j|jd j  q|W | jd j }|rdjdj|}nd}tdj||d	} t| |S )
z$Infer a typing.NamedTuple(...) call.ztyping.NamedTuple   r%   r   z({},)r+   z''z namedtuple({typename}, {fields}))r$   rT   )r   rI   r   r   r   qnamer   r   r0   r	   Listr3   r2   r>   ry   rP   r]   r   rd   )r   r   rI   r)   eltr$   r&   r   r   r   infer_typing_namedtuple  s0    
r   c             C   s   t dd | jD S )Nc             s   s   | ]}|t kr|V  qd S )N)rq   )r!   r|   r   r   r   r4     s    z<lambda>.<locals>.<genexpr>)rr   rF   )clsr   r   r   <lambda>  s   r   )	predicate)NF)N)N)N)N)&__doc__	functoolsr"   textwrapr   Zastroidr   r   r   r   r   r   r	   Zastroid.builderr
   r   r   rG   rq   r   r*   rD   rH   rL   partialZ_looks_like_namedtupleZ_looks_like_enumZ_looks_like_typing_namedtuplerd   r\   ro   rz   r   r   r   Zregister_transformCallr;   r   r   r   r   <module>   sT   
?		
:
7E

%