mirror of
https://github.com/davidhalter/jedi.git
synced 2026-09-04 19:06:56 +08:00
Fix import names from sys path generation
This commit is contained in:
@@ -155,7 +155,7 @@ class Script(object):
|
|||||||
is_package = False
|
is_package = False
|
||||||
if self.path is not None:
|
if self.path is not None:
|
||||||
import_names, is_p = transform_path_to_dotted(
|
import_names, is_p = transform_path_to_dotted(
|
||||||
self._evaluator.get_sys_path(),
|
self._evaluator.get_sys_path(add_parent_paths=False),
|
||||||
self.path
|
self.path
|
||||||
)
|
)
|
||||||
if import_names is not None:
|
if import_names is not None:
|
||||||
|
|||||||
+10
-8
@@ -77,7 +77,8 @@ class Project(object):
|
|||||||
|
|
||||||
py2_comp(path, **kwargs)
|
py2_comp(path, **kwargs)
|
||||||
|
|
||||||
def _get_base_sys_path(self, environment=None):
|
@evaluator_as_method_param_cache()
|
||||||
|
def _get_base_sys_path(self, evaluator, environment=None):
|
||||||
if self._sys_path is not None:
|
if self._sys_path is not None:
|
||||||
return self._sys_path
|
return self._sys_path
|
||||||
|
|
||||||
@@ -93,7 +94,7 @@ class Project(object):
|
|||||||
return sys_path
|
return sys_path
|
||||||
|
|
||||||
@evaluator_as_method_param_cache()
|
@evaluator_as_method_param_cache()
|
||||||
def _get_sys_path(self, evaluator, environment=None):
|
def _get_sys_path(self, evaluator, environment=None, add_parent_paths=True):
|
||||||
"""
|
"""
|
||||||
Keep this method private for all users of jedi. However internally this
|
Keep this method private for all users of jedi. However internally this
|
||||||
one is used like a public method.
|
one is used like a public method.
|
||||||
@@ -101,19 +102,20 @@ class Project(object):
|
|||||||
suffixed = []
|
suffixed = []
|
||||||
prefixed = []
|
prefixed = []
|
||||||
|
|
||||||
sys_path = list(self._get_base_sys_path(environment))
|
sys_path = list(self._get_base_sys_path(evaluator, environment))
|
||||||
if self._smart_sys_path:
|
if self._smart_sys_path:
|
||||||
prefixed.append(self._path)
|
prefixed.append(self._path)
|
||||||
|
|
||||||
if evaluator.script_path is not None:
|
if evaluator.script_path is not None:
|
||||||
suffixed += discover_buildout_paths(evaluator, evaluator.script_path)
|
suffixed += discover_buildout_paths(evaluator, evaluator.script_path)
|
||||||
|
|
||||||
traversed = list(traverse_parents(evaluator.script_path))
|
if add_parent_paths:
|
||||||
|
traversed = list(traverse_parents(evaluator.script_path))
|
||||||
|
|
||||||
# AFAIK some libraries have imports like `foo.foo.bar`, which
|
# AFAIK some libraries have imports like `foo.foo.bar`, which
|
||||||
# leads to the conclusion to by default prefer longer paths
|
# leads to the conclusion to by default prefer longer paths
|
||||||
# rather than shorter ones by default.
|
# rather than shorter ones by default.
|
||||||
suffixed += reversed(traversed)
|
suffixed += reversed(traversed)
|
||||||
|
|
||||||
if self._django:
|
if self._django:
|
||||||
prefixed.append(self._path)
|
prefixed.append(self._path)
|
||||||
|
|||||||
@@ -172,9 +172,9 @@ class Evaluator(object):
|
|||||||
self.recursion_detector = recursion.RecursionDetector()
|
self.recursion_detector = recursion.RecursionDetector()
|
||||||
self.execution_recursion_detector = recursion.ExecutionRecursionDetector(self)
|
self.execution_recursion_detector = recursion.ExecutionRecursionDetector(self)
|
||||||
|
|
||||||
def get_sys_path(self):
|
def get_sys_path(self, **kwargs):
|
||||||
"""Convenience function"""
|
"""Convenience function"""
|
||||||
return self.project._get_sys_path(self, environment=self.environment)
|
return self.project._get_sys_path(self, environment=self.environment, **kwargs)
|
||||||
|
|
||||||
def eval_element(self, context, element):
|
def eval_element(self, context, element):
|
||||||
if not self.infer_enabled:
|
if not self.infer_enabled:
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ from jedi._compatibility import find_module_py33, find_module
|
|||||||
from jedi.evaluate import compiled
|
from jedi.evaluate import compiled
|
||||||
from jedi.evaluate import imports
|
from jedi.evaluate import imports
|
||||||
from jedi.api.project import Project
|
from jedi.api.project import Project
|
||||||
from ..helpers import cwd_at, get_example_dir
|
from ..helpers import cwd_at, get_example_dir, test_dir
|
||||||
|
|
||||||
THIS_DIR = os.path.dirname(__file__)
|
THIS_DIR = os.path.dirname(__file__)
|
||||||
|
|
||||||
@@ -396,3 +396,9 @@ def test_relative_import_out_of_file_system(Script):
|
|||||||
)
|
)
|
||||||
def test_level_to_import_path(level, directory, project_path, result):
|
def test_level_to_import_path(level, directory, project_path, result):
|
||||||
assert imports._level_to_base_import_path(project_path, directory, level) == result
|
assert imports._level_to_base_import_path(project_path, directory, level) == result
|
||||||
|
|
||||||
|
|
||||||
|
def test_import_name_calculation(Script):
|
||||||
|
s = Script(path=os.path.join(test_dir, 'completion', 'isinstance.py'))
|
||||||
|
m = s._get_module()
|
||||||
|
assert m.string_names == ('test', 'completion', 'isinstance')
|
||||||
|
|||||||
Reference in New Issue
Block a user