diff --git a/jedi/api/project.py b/jedi/api/project.py index f39ba90f..d4ef879a 100644 --- a/jedi/api/project.py +++ b/jedi/api/project.py @@ -110,7 +110,10 @@ class Project(object): suffixed += discover_buildout_paths(inference_state, inference_state.script_path) if add_parent_paths: - traversed = list(traverse_parents(inference_state.script_path)) + traversed = list(traverse_parents( + inference_state.script_path, + root=self._path, + )) # AFAIK some libraries have imports like `foo.foo.bar`, which # leads to the conclusion to by default prefer longer paths diff --git a/jedi/common/utils.py b/jedi/common/utils.py index bc71cafd..2427f7e9 100644 --- a/jedi/common/utils.py +++ b/jedi/common/utils.py @@ -2,15 +2,31 @@ import os from contextlib import contextmanager -def traverse_parents(path, include_current=False): +def traverse_parents(path, root=None, include_current=False): + """Iterate directories from a path to search root + + :path: the path of the script/directory to check. + :root: the root of the upward search. Assumes the system root if root is + None. + :include_current: includes the current file / directory. + + If the root path is not a substring of the provided path, assume the root + search path as well. + """ if not include_current: path = os.path.dirname(path) previous = None - while previous != path: - yield path - previous = path - path = os.path.dirname(path) + if root is None or not path.startswith(root): + while previous != path: + yield path + previous = path + path = os.path.dirname(path) + else: + while previous != root: + yield path + previous = path + path = os.path.dirname(path) @contextmanager