ó
î%![c           @   s  d  Z  d d l 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
 „  Z d „  Z d e d „ Z d „  Z e j e d d ƒZ e j e d d ƒZ d d „ Z d „  Z d d „ Z d „  Z e j e j  e	 e ƒ e ƒ e j e j  e	 e ƒ e ƒ e j e j! e ƒ d S(   s.   Astroid hooks for the Python standard library.iÿÿÿÿN(   t   dedent(   t   MANAGERt   UseInferenceDefaultt   inference_tipt   InferenceError(   t	   arguments(   t
   exceptions(   t   nodes(   t   AstroidBuildert   extract_node(   t   utilc         C   st   |  t  j k r t ‚ n  y; t |  j d | ƒ ƒ } | t  j k rN t ƒ  ‚ n | SWn t k
 ro t ƒ  ‚ n Xd  S(   Nt   context(   R
   t   UninferableR   t   nextt   infert   StopIterationR   (   t   nodeR   t   value(    (    sB   lib/python2.7/site-packages/astroid/brain/brain_namedtuple_enum.pyt   _infer_first   s    	c            s–   d  ‡  ‡ ‡ f d † } |  j ‰  |  j } | r@ d „  | Dƒ n i  ‰ | d d d d ƒ } | d d d d ƒ } | r‰ | r‰ | j | f St ƒ  ‚ d  S(	   Nc            sJ   t  ˆ  ƒ |  k r# t ˆ  |  ˆ ƒ S| rF | ˆ k rF t ˆ | ˆ ƒ Sd  S(   N(   t   lenR   (   t   positiont   key_name(   t   argsR   t   found_keywords(    sB   lib/python2.7/site-packages/astroid/brain/brain_namedtuple_enum.pyt"   _extract_namedtuple_arg_or_keyword'   s    c         S   s   i  |  ] } | j  | j “ q S(    (   R   t   arg(   t   .0t   keyword(    (    sB   lib/python2.7/site-packages/astroid/brain/brain_namedtuple_enum.pys
   <dictcomp>1   s   	 R   i    R   t   typenamei   t   field_names(   t   NoneR   t   keywordsR   R   (   R   R   R   R   t   namet   names(    (   R   R   R   sB   lib/python2.7/site-packages/astroid/brain/brain_namedtuple_enum.pyt   _find_func_form_arguments%   s    				c         C   s;  yt  |  | ƒ \ } } y | j j d d ƒ j ƒ  } WnTt k
 r| sx g  | j D] } t | | ƒ j ^ qW } qŽt | d ƒ rÞ t | j	 t
 ƒ rÞ g  | j	 D]2 } t | d t j ƒ r£ t | d | ƒ j ^ q£ } n t | d ƒ rut d „  | j Dƒ ƒ rJg  | j D]1 } t | t j ƒ rt | j d | ƒ j ^ q} q{g  | j D] } t | | ƒ j ^ qT} n t ‚ | sŽt ‚ qŽn XWn# t t j f k
 r´t ƒ  ‚ n X| p¾d } t j | d ƒ } |  j | _ | j j | ƒ x< | D]4 }	 t j ƒ  }
 | |
 _ |	 |
 _ |
 g | j |	 <qöW| | | f S(	   s=   Specific inference function for namedtuple or Python 3 enum. t   ,t    t   itemsi    t   eltsc         s   s!   |  ] } t  | t j ƒ Vq d  S(   N(   t
   isinstanceR   t   Tuple(   R   t   const(    (    sB   lib/python2.7/site-packages/astroid/brain/brain_namedtuple_enum.pys	   <genexpr>]   s   R   t	   docstring(   R"   R   t   replacet   splitt   AttributeErrorR&   R   t   hasattrR'   R%   t   listR   t   Constt   allR(   R   R   R   t   ClassDeft   parentt   basest   appendt	   EmptyNodet   attrnamet   instance_attrs(   R   t	   base_typeR   t   enumR    R!   t
   attributesR)   t
   class_nodet   attrt	   fake_node(    (    sB   lib/python2.7/site-packages/astroid/brain/brain_namedtuple_enum.pyt   infer_func_formB   sF    (!5	4(		c         C   sK   |  j  } t | t j ƒ r( | j | k St | t j ƒ rG | j | k St S(   N(   t   funcR'   R   t	   AttributeR7   t   NameR    t   False(   R   R    R@   (    (    sB   lib/python2.7/site-packages/astroid/brain/brain_namedtuple_enum.pyt   _looks_like}   s    	R    t
   namedtuplet   Enumc            sÀ  t  |  t j j d | ƒ\ } } } t j j |  ƒ } t t d ƒ j	 ƒ  ƒ } y% t | j
 | d | ƒ ƒ j ƒ  } Wn t k
 rŒ t } n X| r¢ t | ƒ } n  d j d „  | Dƒ ƒ } d ‰  d j ‡  f d †  t | ƒ Dƒ ƒ }	 t t ƒ j d	 i | d
 6| d 6|	 d 6| d 6ƒ }
 |
 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 | <qŽWt | g ƒ S(   s4   Specific inference function for namedtuple Call nodeR   s*   import collections; collections.namedtuplet   renames   , c         s   s!   |  ] } d  j  d | ƒ Vq d S(   s
   {arg}=NoneR   N(   t   format(   R   R   (    (    sB   lib/python2.7/site-packages/astroid/brain/brain_namedtuple_enum.pys	   <genexpr>˜   s   s[       {name} = property(lambda self: self[{index:d}], doc='Alias for field number {index:d}')s   
c         3   s-   |  ]# \ } } ˆ  j  d  | d | ƒ Vq d S(   R    t   indexN(   RH   (   R   RI   R    (   t	   field_def(    sB   lib/python2.7/site-packages/astroid/brain/brain_namedtuple_enum.pys	   <genexpr>ž   s   so  
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    t   fieldst
   field_defst   replace_argsi    t   _asdictt   _maket   _replacet   _fields(   R?   R   R(   t   _proxiedR   t   CallSitet	   from_callR   R	   R   t   infer_argumentt
   bool_valueR   RC   t!   _get_renamed_namedtuple_atributest   joint	   enumerateR   R   t   string_buildt   bodyt   localst   iter(   R   R   R<   R    R;   t	   call_siteR@   RG   RM   RL   t   fakeR=   (    (   RJ   sB   lib/python2.7/site-packages/astroid/brain/brain_namedtuple_enum.pyt   infer_named_tuple‰   s8    %
c         C   s²   t  |  ƒ } t ƒ  } x t |  ƒ D]‚ \ } } t d „  | Dƒ ƒ s† t j | ƒ s† | s† | d j ƒ  s† | j d ƒ s† | | k r— d | | | <n  | j | ƒ q" Wt	 | ƒ S(   Nc         s   s'   |  ] } | j  ƒ  p | d  k Vq d S(   t   _N(   t   isalnum(   R   t   c(    (    sB   lib/python2.7/site-packages/astroid/brain/brain_namedtuple_enum.pys	   <genexpr>À   s    i    Ra   s   _%d(
   R/   t   setRY   R1   R   t	   iskeywordt   isdigitt
   startswitht   addt   tuple(   R   R!   t   seent   iR    (    (    sB   lib/python2.7/site-packages/astroid/brain/brain_namedtuple_enum.pyRW   ¼   s    	&2c         C   s>   t  d ƒ } t |  | d | d t ƒd } t | j ƒ  g ƒ S(   s1    Specific inference function for enum Call node. så  
    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 __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__ = ['']
    R   R:   i    (   R	   R?   t   TrueR]   t   instantiate_class(   R   R   t	   enum_metaR<   (    (    sB   lib/python2.7/site-packages/astroid/brain/brain_namedtuple_enum.pyt
   infer_enumÇ   s
    	c         C   sÀ  t  d ƒ } x­|  j D]¢} | | k r. q n  |  j ƒ  j d k rG Pn  xm|  j j ƒ  D]\\ } } t d „  | Dƒ ƒ r qW n  | d j ƒ  } t | t	 j
 ƒ rÜ t | j d t	 j ƒ rÐ | j d j ƒ  } qý | j } n! t | t	 j ƒ rý | j g } n  g  } x  | D]˜ } t d i | j d	 6d
 j |  j ƒ d 6ƒ }	 t t ƒ j |	 ƒ | j }
 | j |
 _ x' |  j ƒ  D] } | g |
 j | j <qrW| j |
 j ƒ  ƒ q
W| |  j | <qW WPq W|  S(   s    Specific inference for enums. RF   t   IntEnums	   enum.Enums   enum.IntEnumR:   c         s   s"   |  ] } t  | t j ƒ Vq d  S(   N(   R'   R   t
   AssignName(   R   R   (    (    sB   lib/python2.7/site-packages/astroid/brain/brain_namedtuple_enum.pys	   <genexpr>õ   s   i    s<  
                class %(name)s(%(types)s):
                    @property
                    def value(self):
                        # Not the best return.
                        return None
                    @property
                    def name(self):
                        return %(name)r
                R    s   , t   types(   RF   Rp   s	   enum.Enums   enum.IntEnum(   Rd   t	   basenamest   rootR    R\   R%   t   anyt	   statementR'   R   t   Assignt   targetsR(   t   iteredt	   AnnAssignt   targetR    RX   R   R   RZ   R3   t	   mymethodsR5   Rm   (   R   R!   t   basenamet   localt   valuest   stmtRx   t   new_targetsR{   t   classdefR_   t   method(    (    sB   lib/python2.7/site-packages/astroid/brain/brain_namedtuple_enum.pyt   infer_enum_classé   s:    		*("   t   __doc__t	   functoolst   sysR   t   textwrapR    t   astroidR   R   R   R   R   R   R   t   astroid.builderR   R	   R
   R   R"   R   RC   R?   RD   t   partialt   _looks_like_namedtuplet   _looks_like_enumR`   RW   Ro   R„   t   register_transformt   CallR2   (    (    (    sB   lib/python2.7/site-packages/astroid/brain/brain_namedtuple_enum.pyt   <module>   s2   "		;	3	"	0