ó
‹²,]c           @   s¦   d  d l  m Z d  d l Z d  d l m Z d  d l m Z m Z d  d l m	 Z	 d  d l
 m Z m Z m Z d  d l m Z d „  Z d	 „  Z d
 „  Z d „  Z d S(   iÿÿÿÿ(   t   literal_evalN(   t   is_module_installed(   t   ut   is_py3(   t   memoize_default(   t   _evaluate_for_statement_stringt   _strip_rst_rolet   DOCSTRING_RETURN_PATTERNS(   t   NumpyDocStringc         C   s«   t  j d |  ƒ r= g  |  j d ƒ D] } | j ƒ  ^ q" } nj |  j d ƒ rž t ss |  j d d ƒ j d d ƒ }  n  t d „  t |  ƒ Dƒ ƒ } t	 | ƒ } n	 |  g } | S(   s2   
    Attempts to interpret the possible types
    s   \bor\bt   ort   {t   [t   }t   ]c         s   s   |  ] } t  | ƒ j Vq d  S(   N(   t   typet   __name__(   t   .0t   x(    (    sF   lib/python2.7/site-packages/spyder/utils/introspection/numpy_docstr.pys	   <genexpr>)   s    (
   t   ret   searcht   splitt   stript
   startswithR   t   replacet   setR    t   list(   t   p_typet   tt   types(    (    sF   lib/python2.7/site-packages/spyder/utils/introspection/numpy_docstr.pyt   _expand_typestr   s    +!	c         C   sq   t  |  ƒ j d } xW | D]O \ } } } | | k r t j d | ƒ } | r_ | j d ƒ } n  t | ƒ Sq Wg  S(   sv  
    Search `docstr` (in numpydoc format) for type(-s) of `param_str`.
    >>> from jedi.evaluate.docstrings import *  # NOQA
    >>> from jedi.evaluate.docstrings import _search_param_in_numpydocstr
    >>> docstr = (
    ...    'Parameters\n'
    ...    '----------\n'
    ...    'x : ndarray\n'
    ...    'y : int or str or list\n'
    ...    'z : {"foo", "bar", 100500}, optional\n'
    ... )
    >>> _search_param_in_numpydocstr(docstr, 'x')
    ['ndarray']
    >>> sorted(_search_param_in_numpydocstr(docstr, 'y'))
    ['int', 'list', 'str']
    >>> sorted(_search_param_in_numpydocstr(docstr, 'z'))
    ['int', 'str']
    t
   Parameterss"   ([^,]+(,[^,]+)*?)(,[ ]*optional)?$i   (   R   t   _parsed_dataR   t   matcht   groupR   (   t   docstrt	   param_strt   paramst   p_nameR   t   p_descrt   m(    (    sF   lib/python2.7/site-packages/spyder/utils/introspection/numpy_docstr.pyt   _search_param_in_numpydocstr1   s    c         C   s    t  |  ƒ } | j d } | | j d 7} g  } xi | D]a \ } } } | s[ | } d } n  t j d | ƒ } | r… | j d ƒ } n  | j t | ƒ ƒ q7 W| S(   s+  
    Search `docstr` (in numpydoc format) for type(-s) of `param_str`.
    >>> from jedi.evaluate.docstrings import *  # NOQA
    >>> from jedi.evaluate.docstrings import _search_return_in_numpydocstr
    >>> from jedi.evaluate.docstrings import _expand_typestr
    >>> docstr = (
    ...    'Returns\n'
    ...    '----------\n'
    ...    'int\n'
    ...    '    can return an anoymous integer\n'
    ...    'out : ndarray\n'
    ...    '    can return a named value\n'
    ... )
    >>> _search_return_in_numpydocstr(docstr)
    ['int', 'ndarray']
    t   Returnst   Yieldst    s   ([^,]+(,[^,]+)*?)$i   (   R   R   R   R    R!   t   extendR   (   R"   t   doct   returnst   foundR%   R   R&   R'   (    (    sF   lib/python2.7/site-packages/spyder/utils/introspection/numpy_docstr.pyt   _search_return_in_numpydocstrN   s    	c         C   s¬   d „  } y t  | j ƒ } Wn  t k
 r> t  | j ƒ } n Xg  } x` | | ƒ D]R } t d d ƒ ry t |  | ƒ } n | j ƒ  } t |  | | ƒ } | j | ƒ qR W| S(   sì  
    Determines a set of potential return types for `func` using docstring hints
    :type evaluator: jedi.evaluate.Evaluator
    :type param: jedi.parser.tree.Param
    :rtype: list
    >>> from jedi.evaluate.docstrings import *  # NOQA
    >>> from jedi.evaluate.docstrings import _search_param_in_docstr
    >>> from jedi.evaluate.docstrings import _evaluate_for_statement_string
    >>> from jedi.evaluate.docstrings import _search_return_in_gooogledocstr
    >>> from jedi.evaluate.docstrings import _search_return_in_numpydocstr
    >>> from jedi._compatibility import builtins
    >>> source = open(jedi.evaluate.docstrings.__file__.replace('.pyc', '.py'), 'r').read()
    >>> script = jedi.Script(source)
    >>> evaluator = script._evaluator
    >>> func = script._get_module().names_dict['find_return_types'][0].parent
    >>> types = find_return_types(evaluator, func)
    >>> print('types = %r' % (types,))
    >>> assert len(types) == 1
    >>> assert types[0].base.obj is builtins.list
    c         S   s[   x9 t  D]1 } | j |  ƒ } | r t | j d ƒ ƒ g Sq Wg  } | sW t |  ƒ } n  | S(   Ni   (   R   R   R   R!   R0   (   R"   t   pR    R/   (    (    sF   lib/python2.7/site-packages/spyder/utils/introspection/numpy_docstr.pyt   search_return_in_docstr…   s    t   jedis   >=0.10.0;<0.11(   R   t   raw_doct   AttributeErrorR-   R   R   t   get_parent_untilR,   (   t   module_contextt   funcR2   R"   R   t   type_strt   type_t   module(    (    sF   lib/python2.7/site-packages/spyder/utils/introspection/numpy_docstr.pyt   find_return_typesp   s    	(   t   astR    R   t   spyder.utils.programsR   t   jedi._compatibilityR   R   t   jedi.evaluate.cacheR   t   jedi.evaluate.docstringsR   R   R   t   numpydoc.docscrapeR   R   R(   R0   R<   (    (    (    sF   lib/python2.7/site-packages/spyder/utils/introspection/numpy_docstr.pyt   <module>   s   			"