diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index df78b88f..4d44759d 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -155,7 +155,7 @@ class Script(object): is_package = False if self.path is not None: import_names, is_p = transform_path_to_dotted( - self._evaluator.get_sys_path(), + self._evaluator.get_sys_path(add_parent_paths=False), self.path ) if import_names is not None: diff --git a/jedi/api/project.py b/jedi/api/project.py index 0e319279..f8f32917 100644 --- a/jedi/api/project.py +++ b/jedi/api/project.py @@ -77,7 +77,8 @@ class Project(object): 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: return self._sys_path @@ -93,7 +94,7 @@ class Project(object): return sys_path @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 one is used like a public method. @@ -101,19 +102,20 @@ class Project(object): suffixed = [] 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: prefixed.append(self._path) if evaluator.script_path is not None: 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 - # leads to the conclusion to by default prefer longer paths - # rather than shorter ones by default. - suffixed += reversed(traversed) + # AFAIK some libraries have imports like `foo.foo.bar`, which + # leads to the conclusion to by default prefer longer paths + # rather than shorter ones by default. + suffixed += reversed(traversed) if self._django: prefixed.append(self._path) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 4fa23557..bba7923b 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -172,9 +172,9 @@ class Evaluator(object): self.recursion_detector = recursion.RecursionDetector() self.execution_recursion_detector = recursion.ExecutionRecursionDetector(self) - def get_sys_path(self): + def get_sys_path(self, **kwargs): """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): if not self.infer_enabled: diff --git a/test/test_evaluate/test_imports.py b/test/test_evaluate/test_imports.py index 7e875e3a..6634bea2 100644 --- a/test/test_evaluate/test_imports.py +++ b/test/test_evaluate/test_imports.py @@ -12,7 +12,7 @@ from jedi._compatibility import find_module_py33, find_module from jedi.evaluate import compiled from jedi.evaluate import imports 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__) @@ -396,3 +396,9 @@ def test_relative_import_out_of_file_system(Script): ) def test_level_to_import_path(level, directory, project_path, 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')