ó
‹²,]c           @   s   d  Z  d „  Z d S(   sæ   
Patching jedi:

[1] Adding numpydoc type returns to docstrings

[2] Adding type returns for compiled objects in jedi

[3] Fixing introspection for matplotlib Axes objects

[4] Fixing None for parents in matplotlib Figure objects
c             sÇ  d d l  m }  |  d d ƒ s. |  d d ƒ r= d d l } n t d ƒ ‚ d d l m } | j | j j j	 _ | j
 | j j j	 _
 |  d d ƒ rÏ d d	 l m ‰ m ‰ m ‰ m ‰  ‡  ‡ ‡ ‡ f d
 †  } n; d d l m ‰ m ‰
 d d l m ‰ ‡ ‡
 ‡ f d †  } | | j j j _ |  d d ƒ rÃd d l m ‰ m ‰ ‡ ‡ ‡ f d †  } | | j j _ d d l m ‰ m ‰ m ‰	 m ‰ m ‰ t ‡ ‡ ‡ ‡ ‡	 ‡ ‡ f d † ‰ ˆ | j j _  n  | S(   s;   Monkey patching jedi

    See [1] and [2] module docstring.iÿÿÿÿ(   t   is_module_installedt   jedis   =0.9.0s   >=0.10.0;<0.11Ns+   jedi not =0.9.0 or 0.10.0, can't be patched(   t   numpy_docstr(   t   builtint   _create_from_namet   debugt   CompiledObjectc         3   sÿ   |  j  d k r d  Sd d l m } | j | |  ƒ } | rg x) | D] } ˆ j d | |  ƒ | VqB Wn  x‘ |  j ƒ  d j ƒ  D]y } y ˆ ˆ ˆ | ƒ } Wn t k
 r° q~ q~ Xt | ˆ  ƒ rÕ | j	 d  k rÕ q~ n  x | j | | ƒ D] } | Vqè Wq~ Wd  S(   Nt   funcdefiÿÿÿÿ(   R   s    docstrings type return: %s in %si   (   t   typet   spyder.utils.introspectionR   t   find_return_typest   dbgt   _parse_function_doct   splitt   AttributeErrort
   isinstancet   objt   Nonet   execute(   t   selft	   evaluatort   paramsR   t   typest   resultt   namet   bltn_obj(   R   R   R   R   (    sD   lib/python2.7/site-packages/spyder/utils/introspection/jedi_patch.pyt   _execute_function,   s$    (   R   t   create(   t   builtinsc         3   s	  d d l  m } |  j d k r# d  St g  ƒ } | t | j |  j |  ƒ ƒ O} ˆ j d | |  ƒ x‹ |  j ƒ  d j ƒ  D]s } y t	 ˆ  | ƒ } Wn t
 k
 r§ qx qx X| d  k rº qx n  ˆ |  j | ƒ } | t |  j j | | ƒ ƒ O} qx Wx | D] } | Vqö Wd  S(   Niÿÿÿÿ(   R   R   s    docstrings type return: %s in %si   (   R	   R   R   t   setR
   t   parent_contextR   R   R   t   getattrR   R   R   R   (   R   R   R   R   R   R   R   (   t	   _builtinsR   R   (    sD   lib/python2.7/site-packages/spyder/utils/introspection/jedi_patch.pyR   H   s$    #(   t   treet	   calculatec            si  t  | ƒ } |  j t | ƒ ƒ } x1| D])} yÿ t | ƒ } ˆ j | d ƒ rn d j d „  | j Dƒ ƒ } n  | d k rt g  | D] } | j ƒ  ^ q„ ƒ } | t t g ƒ k rÕ | d k r|  j | ƒ } qq,| t t	 g ƒ k r,| d k r|  j | ƒ } qq,n ˆ  |  | | |  j | ƒ ƒ } Wq( t
 k
 rPˆ j d | ƒ q( Xq( Wˆ j d | ƒ | S(	   sF   
            Calculate a list of children with operators.
            t   comp_opt    c         s   s   |  ] } t  | j ƒ Vq d  S(   N(   t   strt   value(   t   .0t   c(    (    sD   lib/python2.7/site-packages/spyder/utils/introspection/jedi_patch.pys	   <genexpr>o   s    t   andt   ors#   calculate_children StopIteration %ss   calculate_children types %s(   R)   R*   (   t   itert   eval_elementt   nextt   is_nodet   joint   childrenR   t
   py__bool__t   Truet   Falset   StopIterationt   warningR   (   R   R0   t   iteratorR   t   operatort   rightt   leftt
   left_bools(   R"   R   R!   (    sD   lib/python2.7/site-packages/spyder/utils/introspection/jedi_patch.pyt   calculate_childrene   s,    %(   t   InstanceNamet   Instancet   compiledt   FunctionExecutiont   InstanceElementc            s£   t  | ˆ j ƒ r7 ˆ |  | | j | ƒ } ˆ | | ƒ S| d k rG | S| j d k r t  | ˆ ˆ j ˆ j ˆ j ˆ  f ƒ r | S|  j | ƒ } ˆ |  | | | ƒ S(   sp  
            Returns an InstanceElement if it makes sense, otherwise leaves the
            object untouched.

            Basically having an InstanceElement is context information. That is
            needed in quite a lot of cases, which includes Nodes like
            ``power``, that need to know where a self name comes from for
            example.
            R   N(	   R   t   Namet   parentR   R   R   t   Leaft   Modulet   wrap(   R   t   instancet   vart   is_class_varRB   (   R?   R=   R@   R<   R>   t   get_instance_elR!   (    sD   lib/python2.7/site-packages/spyder/utils/introspection/jedi_patch.pyRI   Œ   s    
	(!   t   spyder.utils.programsR    R   t   ImportErrorR	   R   t   _search_param_in_numpydocstrt   evaluatet   representationt
   docstringsR
   t   jedi.evaluate.compiledR   R   R   R   R   t   jedi._compatibilityR   R>   R   t   jedi.evaluate.precedenceR!   R"   t
   precedenceR;   t   jedi.evaluate.representationR<   R=   R?   R@   R3   RI   (   R    R   R   R   R;   (    (   R   R?   R=   R@   R<   R    R   R   R"   R>   R   R   RI   R!   sD   lib/python2.7/site-packages/spyder/utils/introspection/jedi_patch.pyt   apply   s.    "($N(   t   __doc__RU   (    (    (    sD   lib/python2.7/site-packages/spyder/utils/introspection/jedi_patch.pyt   <module>   s   