B
    7r\                 @   s   d dl Z d dlZd dlmZmZmZ d dl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	Zd
ZdZdd Zdd ZG dd deZdd Zdd ZdddZdS )    N)FileNotFoundErrorNotADirectoryErrorPermissionError)SameEnvironmentget_cached_default_environment)WrongVersion)force_unicode)discover_buildout_paths)evaluator_as_method_param_cache)traverse_parentsz.jedi)zsetup.pyz.gitz.hgzrequirements.txtzMANIFEST.in   c             c   s2   t  }x&| D ]}||krq|| |V  qW d S )N)setadd)pathZusedp r   /lib/python3.7/site-packages/jedi/api/project.py_remove_duplicates_from_path   s    

r   c             C   s   t tt| S )N)listmapr   )Zlstr   r   r   _force_unicode_list   s    r   c               @   sf   e Zd ZdZdZedd Zedd Zdd Z	dd	d
Z
e dddZdd Zdd Zdd ZdS )Project)_environmentNc             C   s   t j| tdS )Nzproject.json)osr   join_CONFIG_FOLDER)	base_pathr   r   r   _get_json_path%   s    zProject._get_json_pathc          	   C   sT   t | |}t|\}}W dQ R X |dkrH|  }|j| |S tddS )zV
        :param path: The path of the directory you want to use as a project.
        Nr   zEThe Jedi version of this project seems newer than what we can handle.)openr   jsonload__new____dict__updater   )clsr   fversiondataselfr   r   r   r    )   s    zProject.loadc                s   d fdd	}||f| dS )a  
        :param path: The base path for this project.
        :param sys_path: list of str. You can override the sys path if you
            want. By default the ``sys.path.`` is generated from the
            environment (virtualenvs, etc).
        :param smart_sys_path: If this is enabled (default), adds paths from
            local directories. Otherwise you will have to rely on your packages
            being properly configured on the ``sys.path``.
        NTFc                s,   |  _ t|tr| _| _| _| _d S )N)_path
isinstancer   r   	_sys_path_smart_sys_path_django)r   environmentsys_pathZsmart_sys_pathr-   )r(   r   r   py2_compD   s    
z"Project.__init__.<locals>.py2_comp)NNTFr   )r(   r   kwargsr0   r   )r(   r   __init__:   s    
 	zProject.__init__c             C   sT   | j d k	r| j S |d kr |  }t| }y|d W n tk
rN   Y nX |S )N )r+   get_environmentr   Zget_sys_pathremove
ValueError)r(   r.   r/   r   r   r   _get_base_sys_pathP   s    
zProject._get_base_sys_pathc             C   s   g }g }t | |}| jr\|| j |jdk	r\|t||j7 }t t|j}|t|7 }| j	rn|| j || | }t t
t|S )z
        Keep this method private for all users of jedi. However internally this
        one is used like a public method.
        N)r   r7   r,   appendr)   Zscript_pathr	   r   reversedr-   r   r   )r(   Z	evaluatorr.   ZsuffixedZprefixedr/   Z	traversedr   r   r   r   _get_sys_path_   s    
zProject._get_sys_pathc          	   C   sT   t | j}x| jD ]}||d  qW t| | jd}tt	|f|S Q R X d S )Nwb)
dictr"   _serializer_ignore_attributespopr   r   r)   r   dump_SERIALIZER_VERSION)r(   r'   Z	attributer%   r   r   r   save|   s
    
zProject.savec             C   s   | j d krt S | j S )N)r   r   )r(   r   r   r   r4      s    
zProject.get_environmentc             C   s   d| j j| jf S )Nz<%s: %s>)	__class____name__r)   )r(   r   r   r   __repr__   s    zProject.__repr__)N)N)rC   
__module____qualname__r=   r   staticmethodr   classmethodr    r2   r7   r
   r:   rA   r4   rD   r   r   r   r   r       s   
r   c             C   s,   x&t D ]}tjtj| |rdS qW dS )NTF)_CONTAINS_POTENTIAL_PROJECTr   r   existsr   )r   namer   r   r   _is_potential_project   s    
rL   c          
   C   sL   y,t tj| dd}d| kS Q R X W n tttfk
rF   dS X dS )zB Detects the path of the very well known Django library (if used) z	manage.pyrbs   DJANGO_SETTINGS_MODULENF)r   r   r   r   readr   r   r   )Z	directoryr%   r   r   r   _is_django_path   s    rO   c             C   s   | d krt  } t j| }d }d }xt|ddD ]x}y
t|S  ttt	fk
rZ   Y nX |d krt j
t j|dr~q2n|}t|rt|ddS |d kr2t|r2|}q2W |d k	rt|S |d k	rt|S t j| r| n
t j| }t|S )NT)Zinclude_currentz__init__.py)r-   )r   getcwdr   realpathr   r   r    r   r   r   rJ   r   rO   rL   isdirdirname)r   ZcheckZprobable_pathZfirst_no_init_filedircurdirr   r   r   get_default_project   s0    
rV   )N)r   r   Zjedi._compatibilityr   r   r   Zjedi.api.environmentr   r   Zjedi.api.exceptionsr   r   Zjedi.evaluate.sys_pathr	   Zjedi.evaluate.cacher
   Zjedi.common.utilsr   r   rI   r@   r   r   objectr   rL   rO   rV   r   r   r   r   <module>   s"   	n