From 323b03af1990e3cfd853e23da36b2757bd0bb139 Mon Sep 17 00:00:00 2001 From: Serhii Tereshchenko Date: Sun, 25 Feb 2024 19:18:27 +0200 Subject: [PATCH 1/4] fix: Exclude site-packages, first pass --- rope/contrib/autoimport/parse.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rope/contrib/autoimport/parse.py b/rope/contrib/autoimport/parse.py index 58ee8fcbd..61f2bd3d7 100644 --- a/rope/contrib/autoimport/parse.py +++ b/rope/contrib/autoimport/parse.py @@ -97,6 +97,8 @@ def get_type_object(imported_object) -> NameType: def get_names(module: ModuleInfo, package: Package) -> List[Name]: """Get all names from a module and package.""" + if "site-packages" in module.modname: + return [] if isinstance(module, ModuleCompiled): return list( get_names_from_compiled(package.name, package.source, module.underlined) From edf2978ce6226450c349727eb80e053ebdb9e575 Mon Sep 17 00:00:00 2001 From: Serhii Tereshchenko Date: Sun, 25 Feb 2024 19:45:50 +0200 Subject: [PATCH 2/4] fix: Fix module name --- rope/contrib/autoimport/parse.py | 2 -- rope/contrib/autoimport/utils.py | 7 +++++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/rope/contrib/autoimport/parse.py b/rope/contrib/autoimport/parse.py index 61f2bd3d7..58ee8fcbd 100644 --- a/rope/contrib/autoimport/parse.py +++ b/rope/contrib/autoimport/parse.py @@ -97,8 +97,6 @@ def get_type_object(imported_object) -> NameType: def get_names(module: ModuleInfo, package: Package) -> List[Name]: """Get all names from a module and package.""" - if "site-packages" in module.modname: - return [] if isinstance(module, ModuleCompiled): return list( get_names_from_compiled(package.name, package.source, module.underlined) diff --git a/rope/contrib/autoimport/utils.py b/rope/contrib/autoimport/utils.py index a16efba05..00e8015cc 100644 --- a/rope/contrib/autoimport/utils.py +++ b/rope/contrib/autoimport/utils.py @@ -69,6 +69,13 @@ 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") + 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 From 36a28ad76eabcd0e46a10168924ee736e230614d Mon Sep 17 00:00:00 2001 From: Serhii Tereshchenko Date: Sun, 25 Feb 2024 20:51:11 +0200 Subject: [PATCH 3/4] fix: Alternative fix, filter resource files --- rope/contrib/autoimport/sqlite.py | 5 ++++- rope/contrib/autoimport/utils.py | 1 + ropetest/contrib/autoimport/utilstest.py | 7 +++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/rope/contrib/autoimport/sqlite.py b/rope/contrib/autoimport/sqlite.py index ceee25980..29a80addd 100644 --- a/rope/contrib/autoimport/sqlite.py +++ b/rope/contrib/autoimport/sqlite.py @@ -369,7 +369,10 @@ def generate_cache( project are cached. """ if resources is None: - resources = self.project.get_python_files() + resources = [ + f for f in self.project.get_python_files() + if "site-packages" not in f.pathlib.parts + ] job_set = task_handle.create_jobset( "Generating autoimport cache", len(resources) ) diff --git a/rope/contrib/autoimport/utils.py b/rope/contrib/autoimport/utils.py index 00e8015cc..e9929cfa4 100644 --- a/rope/contrib/autoimport/utils.py +++ b/rope/contrib/autoimport/utils.py @@ -71,6 +71,7 @@ def get_modname_from_path( modname = "" try: site_packages_index = rel_path_parts.index("site-packages") + raise RuntimeError("No site-packages allowed here.", modpath) except ValueError: pass else: diff --git a/ropetest/contrib/autoimport/utilstest.py b/ropetest/contrib/autoimport/utilstest.py index 511e1a541..94c3e0a6d 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, From 2aaf77c804a565ecf1a67cb65cceed3ec8965292 Mon Sep 17 00:00:00 2001 From: Serhii Tereshchenko Date: Sun, 25 Feb 2024 22:18:08 +0200 Subject: [PATCH 4/4] fix: Test another approach with excluding at project level --- rope/base/project.py | 15 ++++++++++++++- rope/base/resources.py | 2 +- rope/contrib/autoimport/sqlite.py | 5 +---- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/rope/base/project.py b/rope/base/project.py index 84ea237d1..65417fa06 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 b284ba9f1..199a5bc76 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/sqlite.py b/rope/contrib/autoimport/sqlite.py index 29a80addd..ceee25980 100644 --- a/rope/contrib/autoimport/sqlite.py +++ b/rope/contrib/autoimport/sqlite.py @@ -369,10 +369,7 @@ def generate_cache( project are cached. """ if resources is None: - resources = [ - f for f in self.project.get_python_files() - if "site-packages" not in f.pathlib.parts - ] + resources = self.project.get_python_files() job_set = task_handle.create_jobset( "Generating autoimport cache", len(resources) )