@@ -181,6 +181,60 @@ def test_ignores_orphaned_python_files():
181181 )
182182
183183
184+ def test_ignores_invalid_identifier_directories ():
185+ # Python files in directories that don't contain an __init__.py should not be discovered.
186+ module_finder = ModuleFinder ()
187+
188+ file_system = FakeFileSystem (
189+ contents = """
190+ /path/to/namespacepackage/
191+ foo/
192+ valid_underscore_name/
193+ __init__.py
194+ mod.py
195+ invalid-hyphenated-name/
196+ __init__.py
197+ mod.py
198+ 1nvalid-number-prefixed/
199+ __init__.py
200+ mod.py
201+ valid_non_àscii/
202+ __init__.py
203+ mod.py
204+ invalid_non_😃scii/
205+ __init__.py
206+ mod.py
207+ bar/
208+ __init__.py
209+ mod.py
210+ """
211+ )
212+
213+ result = module_finder .find_package (
214+ package_name = "namespacepackage" ,
215+ package_directory = "/path/to/namespacepackage" ,
216+ file_system = file_system ,
217+ )
218+
219+ module_files = {
220+ ModuleFile (module = Module (name ), mtime = DEFAULT_MTIME )
221+ for name in {
222+ "namespacepackage.foo.valid_underscore_name" ,
223+ "namespacepackage.foo.valid_underscore_name.mod" ,
224+ "namespacepackage.foo.valid_non_àscii" ,
225+ "namespacepackage.foo.valid_non_àscii.mod" ,
226+ "namespacepackage.bar" ,
227+ "namespacepackage.bar.mod" ,
228+ }
229+ }
230+ assert result == FoundPackage (
231+ name = "namespacepackage" ,
232+ directory = "/path/to/namespacepackage" ,
233+ module_files = module_files ,
234+ namespace_packages = frozenset ({"namespacepackage" , "namespacepackage.foo" }),
235+ )
236+
237+
184238@pytest .mark .parametrize (
185239 "extension, should_warn" ,
186240 (
0 commit comments