8000 add recursive and lenient modes to stub generation · python/mypy@3f36721 · GitHub
[go: up one dir, main page]

Skip to content

Commit 3f36721

Browse files
committed
add recursive and lenient modes to stub generation
1 parent 345a457 commit 3f36721

File tree

1 file changed

+34
-9
lines changed

1 file changed

+34
-9
lines changed

mypy/stubgen.py

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import importlib
4141
import json
4242
import os.path
43+
import pkgutil
4344
import subprocess
4445
import sys
4546
import textwrap
@@ -574,6 +575,16 @@ def get_qualified_name(o: Node) -> str:
574575
return '<ERROR>'
575576

576577

578+
def walk_packages(packages: List[str]):
579+
for package_name in packages:
580+
package = __import__(package_name)
581+
yield package.__name__
582+
for importer, qualified_name, ispkg in pkgutil.walk_packages(package.__path__,
583+
prefix=package.__name__ + ".",
584+
onerror=lambda r: None):
585+
yield qualified_name
586+
587+
577588
def main() -> None:
578589
options = parse_options()
579590
if not os.path.isdir('out'):
@@ -589,21 +600,29 @@ def main() -> None:
589600
all_class_sigs += class_sigs
590601
sigs = dict(find_unique_signatures(all_sigs))
591602
class_sigs = dict(find_unique_signatures(all_class_sigs))
592-
for module in options.modules:
593-
generate_stub_for_module(module, 'out',
594-
add_header=True,
595-
sigs=sigs,
596-
class_sigs=class_sigs,
597-
pyversion=options.pyversion,
598-
no_import=options.no_import,
599-
search_path=options.search_path,
600-
interpreter=options.interpreter)
603+
for module in (options.modules if not options.recursive else walk_packages(options.modules)):
604+
try:
605+
generate_stub_for_module(module, 'out',
606+
add_header=True,
607+
sigs=sigs,
608+
class_sigs=class_sigs,
609+
pyversion=options.pyversion,
610+
no_import=options.no_import,
611+
search_path=options.search_path,
612+
interpreter=options.interpreter)
613+
except Exception as e:
614+
if not options.lenient:
615+
raise e
616+
else:
617+
print("Stub generation failed for : ", module)
601618

602619

603620
def parse_options() -> Options:
604621
args = sys.argv[1:]
605622
pyversion = defaults.PYTHON3_VERSION
606623
no_import = False
624+
recursive = False
625+
lenient = False
607626
doc_dir = ''
608627
search_path = [] # type: List[str]
609628
interpreter = ''
@@ -619,6 +638,10 @@ def parse_options() -> Options:
619638
elif args[0] == '-p':
620639
interpreter = args[1]
621640
args = args[1:]
641+
elif args[0] == '--recursive':
642+
recursive = True
643+
elif args[0] == '--lenient':
644+
lenient = True
622645
elif args[0] == '--py2':
623646
pyversion = defaults.PYTHON2_VERSION
624647
elif args[0] == '--no-import':
@@ -664,6 +687,8 @@ def usage() -> None:
664687
665688
Options:
666689
--py2 run in Python 2 mode (default: Python 3 mode)
690+
--recursive traverse listed modules to generate inner package modules as well
691+
--lenient ignore exceptions when trying to generate stubs for modules
667692
--no-import don't import the modules, just parse and analyze them
668693
(doesn't work with C extension modules and doesn't
669694
respect __all__)

0 commit comments

Comments
 (0)
0