diff --git a/rope/base/project.py b/rope/base/project.py index 84ea237d..65417fa0 100644 --- a/rope/base/project.py +++ b/rope/base/project.py @@ -224,9 +224,22 @@ def __init__( super().__init__(fscommands) self.ignored = _ResourceMatcher() self.file_list = _FileListCacher(self) + + extra_ignores = [ + p.pathlib.relative_to(self.root.pathlib) + for p in self.get_python_path_folders() + if p.pathlib.is_relative_to(self.root.pathlib) + and "site-packages" in p.pathlib.parts + ] + for p in extra_ignores: + # I'm using this approach, because self.prefs.add after _init_prefs + # does not work for some reason. + prefs["ignored_resources"].append(str(p)) + self._init_prefs(prefs) if ropefolder is not None: self.prefs.add("ignored_resources", ropefolder) + self._init_source_folders() def __repr__(self): @@ -281,7 +294,7 @@ def _init_other_parts(self): # Forcing the creation of `self.pycore` to register observers self.pycore # pylint: disable=pointless-statement - def is_ignored(self, resource): + def is_ignored(self, resource: Resource): return self.ignored.does_match(resource) def sync(self): diff --git a/rope/base/resources.py b/rope/base/resources.py index b284ba9f..199a5bc7 100644 --- a/rope/base/resources.py +++ b/rope/base/resources.py @@ -256,7 +256,7 @@ def _add_pattern(self, pattern): re_pattern = "^(.*/)?" + re_pattern + "(/.*)?$" self.compiled_patterns.append(re.compile(re_pattern)) - def does_match(self, resource): + def does_match(self, resource: Resource): for pattern in self.compiled_patterns: if pattern.match(resource.path): return True diff --git a/rope/contrib/autoimport/utils.py b/rope/contrib/autoimport/utils.py index a16efba0..e9929cfa 100644 --- a/rope/contrib/autoimport/utils.py +++ b/rope/contrib/autoimport/utils.py @@ -69,6 +69,14 @@ def get_modname_from_path( package_name: str = package_path.stem rel_path_parts = modpath.relative_to(package_path).parts modname = "" + try: + site_packages_index = rel_path_parts.index("site-packages") + raise RuntimeError("No site-packages allowed here.", modpath) + except ValueError: + pass + else: + # If path includes "site-packages", we're interested in part after this. + rel_path_parts = rel_path_parts[site_packages_index + 1:] if len(rel_path_parts) > 0: for part in rel_path_parts[:-1]: modname += part diff --git a/ropetest/contrib/autoimport/utilstest.py b/ropetest/contrib/autoimport/utilstest.py index 511e1a54..94c3e0a6 100644 --- a/ropetest/contrib/autoimport/utilstest.py +++ b/ropetest/contrib/autoimport/utilstest.py @@ -34,6 +34,13 @@ def test_get_modname_single_file(typing_path): assert utils.get_modname_from_path(typing_path, typing_path) == "typing" +def test_get_modname_external(example_external_package_path): + assert utils.get_modname_from_path( + example_external_package_path, + example_external_package_path, + ) == "external_fixturepkg" + + def test_get_modname_folder( example_external_package_path, example_external_package_module_path,