-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmkdoc
executable file
·79 lines (63 loc) · 2.07 KB
/
mkdoc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/usr/bin/env python3
"""Docstring."""
import importlib
import inspect
import sys
from textwrap import dedent, indent
class MakeDoc:
"""Docstring."""
def main(self) -> None:
"""Docstring."""
if len(sys.argv) != 2:
print(f"Usage: {sys.argv[0]} module", file=sys.stderr)
sys.exit(2)
modname = sys.argv[1]
mod = importlib.import_module(modname)
print(f"## {modname}")
print()
print(self.dedent_doc(mod.__doc__))
print()
for symbol in mod.__all__:
obj = getattr(mod, symbol)
if inspect.isclass(obj):
# print(f"Skipping CLASS {symbol!r}")
print(f"### class {symbol}")
print()
print(self.dedent_doc(obj.__doc__))
print()
elif inspect.isfunction(obj):
# print(f"Skipping FUNCTION {symbol!r}")
print(f"### function {symbol}")
print()
print(indent(self.dedent_doc(obj.__doc__), " " * 4))
print()
elif inspect.ismethod(obj):
# print(f"Skipping METHOD {symbol!r}")
print(f"### method {symbol}")
print()
print(self.dedent_doc(obj.__doc__))
print()
elif inspect.ismodule(obj):
pass # print(f"Skipping MODULE {symbol!r}")
else:
print("<unhandled>")
def dedent_doc(self, doc: str | None) -> str:
"""Dedent and return the docstring."""
if not doc:
return doc
try:
i = doc.index("\n")
except ValueError:
return doc # Single-line docstring.
# Multi-line docstring.
# Copy the 1st line.
s = doc[:i]
# Copy newlines until start of 2nd (non-blank) line.
while doc[i] == "\n":
s += "\n"
i += 1
# Dedent lines 2 through the remainder.
s += dedent(doc[i:])
return s
if __name__ == "__main__":
MakeDoc().main()