Skip to content

Commit 174f084

Browse files
authored
Merge pull request #733 from MrBago/permError
skip directories with perm error when building autoimport index
2 parents 46a7b16 + 0e229d2 commit 174f084

File tree

3 files changed

+32
-6
lines changed

3 files changed

+32
-6
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# **Upcoming release**
22

3-
- Remove site-packages from packages search tree (@tkrabel)
3+
- #733 skip directories with perm error when building autoimport index (@MrBago)
4+
- #722, #723 Remove site-packages from packages search tree (@tkrabel)
45

56
# Release 1.11.0
67

rope/contrib/autoimport/sqlite.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -546,13 +546,23 @@ def filter_folders(folder: Path) -> bool:
546546
folder_paths = filter(filter_folders, folder_paths) # type:ignore
547547
return list(OrderedDict.fromkeys(folder_paths))
548548

549+
def _safe_iterdir(self, folder: Path):
550+
dirs = folder.iterdir()
551+
while True:
552+
try:
553+
yield next(dirs)
554+
except PermissionError:
555+
pass
556+
except StopIteration:
557+
break
558+
549559
def _get_available_packages(self) -> List[Package]:
550560
packages: List[Package] = [
551561
Package(module, Source.BUILTIN, None, PackageType.BUILTIN)
552562
for module in sys.builtin_module_names
553563
]
554564
for folder in self._get_python_folders():
555-
for package in folder.iterdir():
565+
for package in self._safe_iterdir(folder):
556566
package_tuple = get_package_tuple(package, self.project)
557567
if package_tuple is None:
558568
continue
@@ -602,7 +612,7 @@ def _find_package_path(self, target_name: str) -> Optional[Package]:
602612
if target_name in sys.builtin_module_names:
603613
return Package(target_name, Source.BUILTIN, None, PackageType.BUILTIN)
604614
for folder in self._get_python_folders():
605-
for package in folder.iterdir():
615+
for package in self._safe_iterdir(folder):
606616
package_tuple = get_package_tuple(package, self.project)
607617
if package_tuple is None:
608618
continue

ropetest/contrib/autoimporttest.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -134,13 +134,28 @@ def test_search(self):
134134
self.assertIn(import_statement, self.importer.search("D"))
135135

136136
def test_generate_full_cache(self):
137-
"""The single thread test takes much longer than the multithread test but is easier to debug"""
137+
# The single thread test takes much longer than the multithread test but is easier to debug
138138
single_thread = False
139139
self.importer.generate_modules_cache(single_thread=single_thread)
140140
self.assertIn(("from typing import Dict", "Dict"), self.importer.search("Dict"))
141-
self.assertTrue(len(self.importer._dump_all()) > 0)
141+
self.assertGreater(len(self.importer._dump_all()), 0)
142142
for table in self.importer._dump_all():
143-
self.assertTrue(len(table) > 0)
143+
self.assertGreater(len(table), 0)
144+
145+
def test_skipping_directories_not_accessible_because_of_permission_error(self):
146+
# The single thread test takes much longer than the multithread test but is easier to debug
147+
single_thread = False
148+
self.importer.generate_modules_cache(single_thread=single_thread)
149+
150+
# Create a temporary directory and set permissions to 000
151+
import tempfile, sys
152+
with tempfile.TemporaryDirectory() as dir:
153+
import os
154+
os.chmod(dir, 0o000)
155+
self.importer.project.prefs.python_path = [dir]
156+
self.importer.generate_modules_cache(single_thread=single_thread)
157+
self.assertIn(("from typing import Dict", "Dict"), self.importer.search("Dict"))
158+
self.assertGreater(len(self.importer._dump_all()), 0)
144159

145160

146161
class AutoImportObservingTest(unittest.TestCase):

0 commit comments

Comments
 (0)