Skip to content

Commit c994687

Browse files
committed
WIP apidocs
1 parent 1880564 commit c994687

File tree

3 files changed

+74
-29
lines changed

3 files changed

+74
-29
lines changed

docs/mkrefs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
apidocs:
22
page: ref.md
33
template: ref.jinja
4-
module: mkrefs
4+
package: mkrefs
55
git: https://github.com/DerwenAI/mkrefs/blob/main
66
includes: MkRefsPlugin, PackageDoc
77

mkrefs/apidocs.py

Lines changed: 72 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -51,42 +51,50 @@ class PackageDoc:
5151

5252
def __init__ (
5353
self,
54-
module_name: str,
54+
package_name: str,
5555
git_url: str,
5656
class_list: typing.List[str],
5757
) -> None:
5858
"""
5959
Constructor, to configure a `PackageDoc` object.
6060
61-
module_name:
62-
name of the Python module
61+
package_name:
62+
name of the Python package
6363
6464
git_url:
6565
URL for the Git source repository
6666
6767
class_list:
6868
list of the classes to include in the apidocs
6969
"""
70-
self.module_name = module_name
70+
self.package_name = package_name
7171
self.git_url = git_url
7272
self.class_list = class_list
7373

74-
module_obj = importlib.import_module(self.module_name)
75-
self.module_obj = sys.modules[self.module_name]
74+
package_obj = importlib.import_module(self.package_name)
75+
self.package_obj = sys.modules[self.package_name]
7676

7777
self.md: typing.List[str] = [
78-
"# Reference: `{}` package".format(self.module_name),
78+
"# Reference: `{}` package".format(self.package_name),
7979
]
8080

81+
self.meta = {
82+
"package": self.package_name,
83+
"git_url": self.git_url,
84+
"class": {},
85+
"function": {},
86+
"type": {},
87+
}
88+
8189

8290
def show_all_elements (
8391
self
8492
) -> None:
8593
"""
86-
Show all possible elements from `inspect` for the given module, for
94+
Show all possible elements from `inspect` for the given package, for
8795
debugging purposes.
8896
"""
89-
for name, obj in inspect.getmembers(self.module_obj):
97+
for name, obj in inspect.getmembers(self.package_obj):
9098
for n, o in inspect.getmembers(obj):
9199
ic(name, n, o)
92100
ic(type(o))
@@ -96,14 +104,14 @@ def get_todo_list (
96104
self
97105
) -> typing.Dict[ str, typing.Any]:
98106
"""
99-
Walk the module tree to find class definitions to document.
107+
Walk the package tree to find class definitions to document.
100108
101109
returns:
102110
a dictionary of class objects which need apidocs generated
103111
"""
104112
todo_list: typing.Dict[ str, typing.Any] = {
105113
class_name: class_obj
106-
for class_name, class_obj in inspect.getmembers(self.module_obj, inspect.isclass)
114+
for class_name, class_obj in inspect.getmembers(self.package_obj, inspect.isclass)
107115
if class_name in self.class_list
108116
}
109117

@@ -118,8 +126,11 @@ def build (
118126
"""
119127
todo_list: typing.Dict[ str, typing.Any] = self.get_todo_list()
120128

121-
# markdown for top-level module description
122-
self.md.extend(self.get_docstring(self.module_obj))
129+
# markdown for top-level package description
130+
docstring = self.get_docstring(self.package_obj)
131+
self.md.extend(docstring)
132+
133+
self.meta["docstring"] = docstring
123134

124135
# find and format the class definitions
125136
for class_name in self.class_list:
@@ -230,7 +241,7 @@ def fix_fwd_refs (
230241
anno: str,
231242
) -> typing.Optional[str]:
232243
"""
233-
Substitute the quoted forward references for a given module class.
244+
Substitute the quoted forward references for a given package class.
234245
235246
anno:
236247
raw annotated type for the forward reference
@@ -257,6 +268,7 @@ def document_method (
257268
name: str,
258269
obj: typing.Any,
259270
func_kind: str,
271+
func_meta: dict,
260272
) -> typing.Tuple[int, typing.List[str]]:
261273
"""
262274
Generate apidocs markdown for the given class method.
@@ -273,6 +285,9 @@ class method object
273285
func_kind:
274286
function kind
275287
288+
func_meta:
289+
function metadata
290+
276291
returns:
277292
line number, plus apidocs for the method as a list of markdown lines
278293
"""
@@ -283,6 +298,8 @@ class method object
283298
anchor = "#### [`{}` {}](#{})".format(name, func_kind, frag)
284299
local_md.append(anchor)
285300

301+
func_meta["ns_path"] = frag
302+
286303
# link to source code in Git repo
287304
code = obj.__code__
288305
line_num = code.co_firstlineno
@@ -291,6 +308,8 @@ class method object
291308
src_url = "[*\[source\]*]({}{}#L{})\n".format(self.git_url, file, line_num) # pylint: disable=W1401
292309
local_md.append(src_url)
293310

311+
func_meta["line_num"] = line_num
312+
294313
# format the callable signature
295314
sig = inspect.signature(obj)
296315
arg_list = self.get_arg_list(sig)
@@ -300,6 +319,8 @@ class method object
300319
local_md.append("{}({})".format(name, arg_list_str))
301320
local_md.append("```")
302321

322+
func_meta["arg_list_str"] = arg_list_str
323+
303324
# include the docstring, with return annotation
304325
arg_dict: dict = {
305326
name.split("=")[0]: anno
@@ -313,9 +334,13 @@ class method object
313334
if ret:
314335
arg_dict["returns"] = self.extract_type_annotation(ret)
315336

316-
local_md.extend(self.get_docstring(obj, parse=True, arg_dict=arg_dict))
337+
arg_docstring = self.get_docstring(obj, parse=True, arg_dict=arg_dict)
338+
local_md.extend(arg_docstring)
317339
local_md.append("")
318340

341+
func_meta["arg_dict"] = arg_dict
342+
func_meta["arg_docstring"] = arg_docstring
343+
319344
return line_num, local_md
320345

321346

@@ -419,17 +444,24 @@ def document_type (
419444
"""
420445
local_md: typing.List[str] = []
421446

447+
type_meta = {}
448+
self.meta["type"][name] = type_meta
449+
422450
# format a header + anchor
423451
frag = ".".join(path_list + [ name ])
424452
anchor = "#### [`{}` {}](#{})".format(name, "type", frag)
425453
local_md.append(anchor)
426454

455+
type_meta["ns_path"] = frag
456+
427457
# show type definition
428458
local_md.append("```python")
429459
local_md.append("{} = {}".format(name, obj))
430460
local_md.append("```")
431461
local_md.append("")
432462

463+
type_meta["obj"] = obj
464+
433465
return local_md
434466

435467

@@ -482,14 +514,21 @@ class object
482514
docstring = class_obj.__doc__
483515
src = inspect.getsourcelines(class_obj)
484516

517+
class_meta = {
518+
"docstring": docstring,
519+
"method": {},
520+
}
521+
522+
self.meta["class"][class_name] = class_meta
523+
485524
if docstring:
486525
# add the raw docstring for a class
487526
self.md.append(docstring)
488527

489528
obj_md_pos: typing.Dict[int, typing.List[str]] = {}
490529

491530
for member_name, member_obj in inspect.getmembers(class_obj):
492-
path_list = [self.module_name, class_name]
531+
path_list = [self.package_name, class_name]
493532

494533
if member_name.startswith("__") or not member_name.startswith("_"):
495534
if member_name not in class_obj.__dict__:
@@ -503,7 +542,10 @@ class object
503542
else:
504543
continue
505544

506-
_, obj_md = self.document_method(path_list, member_name, member_obj, func_kind)
545+
func_meta = {}
546+
class_meta["method"][member_name] = func_meta
547+
548+
_, obj_md = self.document_method(path_list, member_name, member_obj, func_kind, func_meta)
507549
line_num = self.find_line_num(src, member_name)
508550
obj_md_pos[line_num] = obj_md
509551

@@ -515,32 +557,35 @@ def format_functions (
515557
self
516558
) -> None:
517559
"""
518-
Walk the module tree, and for each function definition format its
560+
Walk the package tree, and for each function definition format its
519561
apidocs as markdown.
520562
"""
521563
self.md.append("---")
522-
self.md.append("## [module functions](#{})".format(self.module_name))
564+
self.md.append("## [package functions](#{})".format(self.package_name))
523565

524-
for func_name, func_obj in inspect.getmembers(self.module_obj, inspect.isfunction):
566+
for func_name, func_obj in inspect.getmembers(self.package_obj, inspect.isfunction):
525567
if not func_name.startswith("_"):
526-
_, obj_md = self.document_method([self.module_name], func_name, func_obj, "function")
568+
func_meta = {}
569+
self.meta["function"][func_name] = func_meta
570+
571+
_, obj_md = self.document_method([self.package_name], func_name, func_obj, "function", func_meta)
527572
self.md.extend(obj_md)
528573

529574

530575
def format_types (
531576
self
532577
) -> None:
533578
"""
534-
Walk the module tree, and for each type definition format its apidocs
579+
Walk the package tree, and for each type definition format its apidocs
535580
as markdown.
536581
"""
537582
self.md.append("---")
538-
self.md.append("## [module types](#{})".format(self.module_name))
583+
self.md.append("## [package types](#{})".format(self.package_name))
539584

540-
for name, obj in inspect.getmembers(self.module_obj):
585+
for name, obj in inspect.getmembers(self.package_obj):
541586
if obj.__class__.__module__ == "typing":
542587
if not str(obj).startswith("~"):
543-
obj_md = self.document_type([self.module_name], name, obj)
588+
obj_md = self.document_type([self.package_name], name, obj)
544589
self.md.extend(obj_md)
545590

546591

@@ -565,7 +610,7 @@ def render_apidocs ( # pylint: disable=R0914
565610
returns:
566611
rendered Markdown
567612
"""
568-
module_name = local_config["apidocs"]["module"]
613+
package_name = local_config["apidocs"]["package"]
569614
git_url = local_config["apidocs"]["git"]
570615

571616
includes = [
@@ -574,7 +619,7 @@ def render_apidocs ( # pylint: disable=R0914
574619
]
575620

576621
pkg_doc = PackageDoc(
577-
module_name,
622+
package_name,
578623
git_url,
579624
includes,
580625
)

mkrefs/plugin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class MkRefsPlugin (mkdocs.plugins.BasePlugin):
4141
"apidocs": {
4242
"page": "the generated Markdown page; e.g., `ref.md`",
4343
"template": "a Jinja2 template; e.g., `ref.jinja`",
44-
"module": "module name for the package",
44+
"package": "the Python package name",
4545
"git": "URL to the source code in a public Git repository",
4646
"includes": "class and function names to include",
4747
},

0 commit comments

Comments
 (0)