ó
’›V]c           @   s  d  d l  Z  d  d l 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 d  d l m Z d  d l m Z d  d	 l m Z d  d
 l m Z d „  Z d „  Z d „  Z e d g  ƒ d „  ƒ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d S(   iÿÿÿÿN(   t   unicodet   force_unicodet   all_suffixes(   t   evaluator_method_cache(   t   ContextualizedNode(   t	   is_string(   t   traverse_parents(   t   get_cached_code_lines(   t   FileIO(   t   settings(   t   debugc         C   so   t  j j | ƒ r | S|  j ƒ  } | d  k r2 d  St  j j | ƒ } t | ƒ } t  j j t  j j | | ƒ ƒ S(   N(	   t   ost   patht   isabst
   py__file__t   Nonet   dirnameR   t   abspatht   join(   t   module_contextR   t   module_patht   base_dir(    (    s5   lib/python2.7/site-packages/jedi/evaluate/sys_path.pyt	   _abs_path   s    c   
      c   s  x‰t  | j d d d … | j d d d … ƒ D]X\ } } y® | d k sQ t ‚ | j d k ru t | j ƒ d k s{ t ‚ | j } | d j d	 k rª | d j d
 k s° t ‚ | d } | j d d k rã | j d j d k sé t ‚ Wn t k
 r q0 n Xt |  j | ƒ | ƒ } xl | j ƒ  j	 | ƒ D]U } xL | j ƒ  D]> } t
 | ƒ rBt |  | j ƒ  ƒ }	 |	 d k	 r€|	 Vq€qBqBWq/Wq0 Wd S(   s¾  
    Extracts the assigned strings from an assignment that looks as follows::

        sys.path[0:0] = ['module/path', 'another/module/path']

    This function is in general pretty tolerant (and therefore 'buggy').
    However, it's not a big issue usually to add more paths to Jedi's sys_path,
    because it will only affect Jedi in very random situations and by adding
    more paths than necessary, it usually benefits the general user.
    Ni   i   t   =s   +=t   powert	   atom_expri    t   namet   syst   .R   (   R   s   +=(   R   R   (   t   zipt   childrent   AssertionErrort   typet   lent   valueR   t   create_contextt   infert   iterateR   R   t   get_safe_valueR   (
   R   t	   expr_stmtt   assigneet   operatort   ct   trailert   cnt   lazy_contextt   contextt   abs_path(    (    s5   lib/python2.7/site-packages/jedi/evaluate/sys_path.pyt   _paths_from_assignment   s&    <	,
/c         c   s  | j  d k oV | j d d k oV | j  d k oV | j d d k oV t | j ƒ d k s] d S| j d j } | d k r} d S| j d } | d k r» t | j ƒ d k r» | j d } n  xX |  j | ƒ j | ƒ D]> } t | ƒ rÔ t |  | j ƒ  ƒ } | d k	 r| VqqÔ qÔ Wd S(   sE    extract the path from either "sys.path.append" or "sys.path.insert" R+   i    R   t   (i   Ni   t   insertt   appendi   i   (   R2   R3   (   i   i   (
   R    R   R!   R"   R#   t	   eval_nodeR   R   R&   R   (   R   t   trailer1t   trailer2R   t   argR.   R/   (    (    s5   lib/python2.7/site-packages/jedi/evaluate/sys_path.pyt   _paths_from_list_modificationsH   s    ""!t   defaultc         C   sã   d „  } |  j  d k r g  Sg  } y |  j  j ƒ  d } Wn t k
 rL n“ Xx | | ƒ D] \ } } | j } t | j ƒ d k r§ | j t |  | j d d !Œ ƒ qZ | d k	 rZ | j	 d k rZ | j t
 |  | ƒ ƒ qZ qZ W| S(   s6   
    Detect sys.path modifications within module.
    c         s   sÁ   xº |  D]² } | j  j  } | d  k	 r | j d	 k r | j } | d j d k r¹ | d j d k r¹ | d j d k r¹ | d j d } | j d k r¶ | j d k r¶ | | f Vq¶ q¹ q q Wd  S(
   NR   R   i    R   R   i   R+   R   (   R   R   (   t   parentR   R    R   R"   (   t   namesR   R   R*   t   n(    (    s5   lib/python2.7/site-packages/jedi/evaluate/sys_path.pyt   get_sys_path_powersd   s    	&R   i   i   R'   N(   t	   tree_nodeR   t   get_used_namest   KeyErrorR:   R!   R   t   extendR8   R    R0   (   R   R=   t   addedt   possible_namesR   R   R'   (    (    s5   lib/python2.7/site-packages/jedi/evaluate/sys_path.pyt   check_sys_path_modifications_   s"    		c         C   sK   t  ƒ  } x; t | ƒ D]- } x$ t |  | ƒ D] } | j | ƒ q, Wq W| S(   N(   t   sett   _get_buildout_script_pathst   _get_paths_from_buildout_scriptt   add(   t	   evaluatort   script_patht   buildout_script_pathst   buildout_script_pathR   (    (    s5   lib/python2.7/site-packages/jedi/evaluate/sys_path.pyt   discover_buildout_paths…   s
    	c      
   c   s°   t  | ƒ } y% |  j d | d t d t j ƒ } Wn" t k
 rU t j d | ƒ d  SXd d l m	 } | |  | | d d  d t |  j | ƒ ƒ} x t | ƒ D] } | Vq Wd  S(	   Nt   file_iot   cachet
   cache_paths(   Error trying to read buildout_script: %siÿÿÿÿ(   t   ModuleContextt   string_namest
   code_lines(   R   t   parset   TrueR	   t   cache_directoryt   IOErrorR
   t   warningt   jedi.evaluate.contextRQ   R   R   t   grammarRD   (   RI   RL   RN   t   module_nodeRQ   t   moduleR   (    (    s5   lib/python2.7/site-packages/jedi/evaluate/sys_path.pyRG      s     	c         C   s@   x9 t  |  ƒ D]+ } t j j t j j | | ƒ ƒ r | Sq Wd  S(   N(   R   R   R   t   isfileR   R   (   R   t   filenameR:   (    (    s5   lib/python2.7/site-packages/jedi/evaluate/sys_path.pyt   _get_parent_dir_with_file¥   s    !c         c   sô   t  |  d ƒ } | s d St j j | d ƒ } t j j | ƒ sD d Sx© t j | ƒ D]˜ } y` t j j | | ƒ } t | d ƒ 6 } | j ƒ  } | j d ƒ r³ d | k r³ | Vn  Wd QXWqT t	 t
 f k
 rë } t j t | ƒ ƒ qT qT XqT Wd S(   s  
    if there is a 'buildout.cfg' file in one of the parent directories of the
    given module it will return a list of all files in the buildout bin
    directory that look like python files.

    :param search_path: absolute path to the module.
    :type search_path: str
    s   buildout.cfgNt   bint   rs   #!t   python(   R_   R   R   R   t   existst   listdirt   opent   readlinet
   startswitht   UnicodeDecodeErrorRW   R
   RX   R    (   t   search_patht   project_roott   bin_pathR^   t   filepatht   ft	   firstlinet   e(    (    s5   lib/python2.7/site-packages/jedi/evaluate/sys_path.pyRF   ¬   s     	c         C   s<   x5 t  ƒ  D]* } |  j | ƒ r
 |  t | ƒ  }  Pq
 q
 W|  S(   N(   R   t   endswithR!   (   R   t   suffix(    (    s5   lib/python2.7/site-packages/jedi/evaluate/sys_path.pyt   remove_python_path_suffixÊ   s
    c            s‘   t  ˆ  ƒ ‰  ˆ  j t j j d ƒ } | rC ˆ  t d ƒ d  ‰  n  ‡  ‡ f d †  } t | ƒ  ƒ } | st d t f St	 | d d „  ƒd | f S(   sZ  
    Returns the dotted path inside a sys.path as a list of names. e.g.

    >>> from os.path import abspath
    >>> transform_path_to_dotted([abspath("/foo")], abspath('/foo/bar/baz.py'))
    (('bar', 'baz'), False)

    Returns (None, False) if the path doesn't really resolve to anything.
    The second return part is if it is a package.
    t   __init__i   c          3   s¡   xš ˆ D]’ }  ˆ  j  |  ƒ r ˆ  t |  ƒ } | j  t j j ƒ sP | j  d ƒ r] | d } n  | r™ | j t j j ƒ } t | ƒ sˆ d  St | ƒ Vq™ q q Wd  S(   Nt   /i   (   Rg   R!   R   R   t   sept   splitt   allt   tuple(   t   pt   restRv   (   R   t   sys_path(    s5   lib/python2.7/site-packages/jedi/evaluate/sys_path.pyt   iter_potential_solutionsé   s    $t   keyc         S   s
   t  |  ƒ S(   N(   R!   (   Ry   (    (    s5   lib/python2.7/site-packages/jedi/evaluate/sys_path.pyt   <lambda>  t    i    N(
   Rr   Rp   R   R   Ru   R!   Rx   R   t   Falset   sorted(   R{   R   t
   is_packageR|   t   potential_solutions(    (   R   R{   s5   lib/python2.7/site-packages/jedi/evaluate/sys_path.pyt   transform_path_to_dottedÒ   s    
(   R   t   jedi._compatibilityR    R   R   t   jedi.evaluate.cacheR   t   jedi.evaluate.base_contextR   t   jedi.evaluate.helpersR   t   jedi.common.utilsR   t   jedi.parser_utilsR   t   jedi.file_ioR   t   jediR	   R
   R   R0   R8   RD   RM   RG   R_   RF   Rr   R„   (    (    (    s5   lib/python2.7/site-packages/jedi/evaluate/sys_path.pyt   <module>   s&   		+	&	
				