@@ -175,65 +175,67 @@ def find_modules(self, path: Path) -> Generator[Optional[str], None, None]:
175
175
# Path is on skiplist
176
176
return
177
177
178
- try :
179
- children = path .iterdir ()
180
- except OSError :
181
- # Path is not readable
182
- return
183
-
184
178
finder = importlib .machinery .FileFinder (str (path ), * LOADERS ) # type: ignore
185
- for p in children :
186
- if p .name .startswith ("." ) or p .name == "__pycache__" :
187
- # Impossible to import from names starting with . and we can skip __pycache__
188
- continue
189
- elif any (fnmatch .fnmatch (p .name , entry ) for entry in self .skiplist ):
190
- # Path is on skiplist
191
- continue
192
- elif not any (p .name .endswith (suffix ) for suffix in SUFFIXES ):
193
- # Possibly a package
194
- if "." in p .name :
179
+ try :
180
+ for p in path .iterdir ():
181
+ if p .name .startswith ("." ) or p .name == "__pycache__" :
182
+ # Impossible to import from names starting with . and we can skip __pycache__
195
183
continue
196
- elif p .is_dir ():
197
- # Unfortunately, CPython just crashes if there is a directory
198
- # which ends with a python extension, so work around.
199
- continue
200
- name = p .name
201
- for suffix in SUFFIXES :
202
- if name .endswith (suffix ):
203
- name = name [: - len (suffix )]
204
- break
205
- if name == "badsyntax_pep3120" :
206
- # Workaround for issue #166
207
- continue
208
-
209
- package_pathname = None
210
- try :
211
- with warnings .catch_warnings ():
212
- warnings .simplefilter ("ignore" , ImportWarning )
213
- spec = finder .find_spec (name )
214
- if spec is None :
184
+ elif any (
185
+ fnmatch .fnmatch (p .name , entry ) for entry in self .skiplist
186
+ ):
187
+ # Path is on skiplist
188
+ continue
189
+ elif not any (p .name .endswith (suffix ) for suffix in SUFFIXES ):
190
+ # Possibly a package
191
+ if "." in p .name :
215
192
continue
216
- if spec .submodule_search_locations is not None :
217
- package_pathname = spec .submodule_search_locations [0 ]
218
- except (ImportError , OSError , SyntaxError , UnicodeEncodeError ):
219
- # UnicodeEncodeError happens with Python 3 when there is a filename in some invalid encoding
220
- continue
193
+ elif p .is_dir ():
194
+ # Unfortunately, CPython just crashes if there is a directory
195
+ # which ends with a python extension, so work around.
196
+ continue
197
+ name = p .name
198
+ for suffix in SUFFIXES :
199
+ if name .endswith (suffix ):
200
+ name = name [: - len (suffix )]
201
+ break
202
+ if name == "badsyntax_pep3120" :
203
+ # Workaround for issue #166
204
+ continue
221
205
222
- if package_pathname is not None :
223
- path_real = Path (package_pathname ).resolve ()
206
+ package_pathname = None
224
207
try :
225
- stat = path_real .stat ()
226
- except OSError :
208
+ with warnings .catch_warnings ():
209
+ warnings .simplefilter ("ignore" , ImportWarning )
210
+ spec = finder .find_spec (name )
211
+ if spec is None :
212
+ continue
213
+ if spec .submodule_search_locations is not None :
214
+ package_pathname = spec .submodule_search_locations [
215
+ 0
216
+ ]
217
+ except (ImportError , OSError , SyntaxError , UnicodeEncodeError ):
218
+ # UnicodeEncodeError happens with Python 3 when there is a filename in some invalid encoding
227
219
continue
228
- loaded_inode = _LoadedInode (stat .st_dev , stat .st_ino )
229
- if loaded_inode not in self .paths :
230
- self .paths .add (loaded_inode )
231
- for subname in self .find_modules (path_real ):
232
- if subname is None :
233
- yield None # take a break to avoid unresponsiveness
234
- elif subname != "__init__" :
235
- yield f"{ name } .{ subname } "
236
- yield name
220
+
221
+ if package_pathname is not None :
222
+ path_real = Path (package_pathname ).resolve ()
223
+ try :
224
+ stat = path_real .stat ()
225
+ except OSError :
226
+ continue
227
+ loaded_inode = _LoadedInode (stat .st_dev , stat .st_ino )
228
+ if loaded_inode not in self .paths :
229
+ self .paths .add (loaded_inode )
230
+ for subname in self .find_modules (path_real ):
231
+ if subname is None :
232
+ yield None # take a break to avoid unresponsiveness
233
+ elif subname != "__init__" :
234
+ yield f"{ name } .{ subname } "
235
+ yield name
236
+ except OSError :
237
+ # Path is not readable
238
+ return
237
239
yield None # take a break to avoid unresponsiveness
238
240
239
241
def find_all_modules (
0 commit comments