10
10
import importlib
11
11
import inspect
12
12
import os
13
+ import pkgutil
13
14
import re
14
15
import sys
15
16
import types
@@ -164,6 +165,17 @@ def get_description(self, concise: bool = False) -> str:
164
165
# Core logic
165
166
# ====================
166
167
168
+ def silent_import_module (module_name : str ) -> types .ModuleType :
169
+ with open (os .devnull , "w" ) as devnull :
170
+ with warnings .catch_warnings (), redirect_stdout (devnull ), redirect_stderr (devnull ):
171
+ warnings .simplefilter ("ignore" )
172
+ runtime = importlib .import_module (module_name )
173
+ # Also run the equivalent of `from module import *`
174
+ # This could have the additional effect of loading not-yet-loaded submodules
175
+ # mentioned in __all__
176
+ __import__ (module_name , fromlist = ["*" ])
177
+ return runtime
178
+
167
179
168
180
def test_module (module_name : str ) -> Iterator [Error ]:
169
181
"""Tests a given module's stub against introspecting it at runtime.
@@ -175,18 +187,14 @@ def test_module(module_name: str) -> Iterator[Error]:
175
187
"""
176
188
stub = get_stub (module_name )
177
189
if stub is None :
178
- yield Error ([module_name ], "failed to find stubs" , MISSING , None , runtime_desc = "N/A" )
190
+ runtime_desc = repr (sys .modules [module_name ]) if module_name in sys .modules else "N/A"
191
+ yield Error (
192
+ [module_name ], "failed to find stubs" , MISSING , None , runtime_desc = runtime_desc
193
+ )
179
194
return
180
195
181
196
try :
182
- with open (os .devnull , "w" ) as devnull :
183
- with warnings .catch_warnings (), redirect_stdout (devnull ), redirect_stderr (devnull ):
184
- warnings .simplefilter ("ignore" )
185
- runtime = importlib .import_module (module_name )
186
- # Also run the equivalent of `from module import *`
187
- # This could have the additional effect of loading not-yet-loaded submodules
188
- # mentioned in __all__
189
- __import__ (module_name , fromlist = ["*" ])
197
+ runtime = silent_import_module (module_name )
190
198
except Exception as e :
191
199
yield Error ([module_name ], f"failed to import, { type (e ).__name__ } : { e } " , stub , MISSING )
192
200
return
@@ -1289,7 +1297,18 @@ def build_stubs(modules: List[str], options: Options, find_submodules: bool = Fa
1289
1297
else :
1290
1298
found_sources = find_module_cache .find_modules_recursive (module )
1291
1299
sources .extend (found_sources )
1300
+ # find submodules via mypy
1292
1301
all_modules .extend (s .module for s in found_sources if s .module not in all_modules )
1302
+ # find submodules via pkgutil
1303
+ try :
1304
+ runtime = silent_import_module (module )
1305
+ all_modules .extend (
1306
+ m .name
1307
+ for m in pkgutil .walk_packages (runtime .__path__ , runtime .__name__ + "." )
1308
+ if m .name not in all_modules
1309
+ )
1310
+ except Exception :
1311
+ pass
1293
1312
1294
1313
if sources :
1295
1314
try :
0 commit comments