@@ -51,42 +51,50 @@ class PackageDoc:
51
51
52
52
def __init__ (
53
53
self ,
54
- module_name : str ,
54
+ package_name : str ,
55
55
git_url : str ,
56
56
class_list : typing .List [str ],
57
57
) -> None :
58
58
"""
59
59
Constructor, to configure a `PackageDoc` object.
60
60
61
- module_name :
62
- name of the Python module
61
+ package_name :
62
+ name of the Python package
63
63
64
64
git_url:
65
65
URL for the Git source repository
66
66
67
67
class_list:
68
68
list of the classes to include in the apidocs
69
69
"""
70
- self .module_name = module_name
70
+ self .package_name = package_name
71
71
self .git_url = git_url
72
72
self .class_list = class_list
73
73
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 ]
76
76
77
77
self .md : typing .List [str ] = [
78
- "# Reference: `{}` package" .format (self .module_name ),
78
+ "# Reference: `{}` package" .format (self .package_name ),
79
79
]
80
80
81
+ self .meta = {
82
+ "package" : self .package_name ,
83
+ "git_url" : self .git_url ,
84
+ "class" : {},
85
+ "function" : {},
86
+ "type" : {},
87
+ }
88
+
81
89
82
90
def show_all_elements (
83
91
self
84
92
) -> None :
85
93
"""
86
- Show all possible elements from `inspect` for the given module , for
94
+ Show all possible elements from `inspect` for the given package , for
87
95
debugging purposes.
88
96
"""
89
- for name , obj in inspect .getmembers (self .module_obj ):
97
+ for name , obj in inspect .getmembers (self .package_obj ):
90
98
for n , o in inspect .getmembers (obj ):
91
99
ic (name , n , o )
92
100
ic (type (o ))
@@ -96,14 +104,14 @@ def get_todo_list (
96
104
self
97
105
) -> typing .Dict [ str , typing .Any ]:
98
106
"""
99
- Walk the module tree to find class definitions to document.
107
+ Walk the package tree to find class definitions to document.
100
108
101
109
returns:
102
110
a dictionary of class objects which need apidocs generated
103
111
"""
104
112
todo_list : typing .Dict [ str , typing .Any ] = {
105
113
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 )
107
115
if class_name in self .class_list
108
116
}
109
117
@@ -118,8 +126,11 @@ def build (
118
126
"""
119
127
todo_list : typing .Dict [ str , typing .Any ] = self .get_todo_list ()
120
128
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
123
134
124
135
# find and format the class definitions
125
136
for class_name in self .class_list :
@@ -230,7 +241,7 @@ def fix_fwd_refs (
230
241
anno : str ,
231
242
) -> typing .Optional [str ]:
232
243
"""
233
- Substitute the quoted forward references for a given module class.
244
+ Substitute the quoted forward references for a given package class.
234
245
235
246
anno:
236
247
raw annotated type for the forward reference
@@ -257,6 +268,7 @@ def document_method (
257
268
name : str ,
258
269
obj : typing .Any ,
259
270
func_kind : str ,
271
+ func_meta : dict ,
260
272
) -> typing .Tuple [int , typing .List [str ]]:
261
273
"""
262
274
Generate apidocs markdown for the given class method.
@@ -273,6 +285,9 @@ class method object
273
285
func_kind:
274
286
function kind
275
287
288
+ func_meta:
289
+ function metadata
290
+
276
291
returns:
277
292
line number, plus apidocs for the method as a list of markdown lines
278
293
"""
@@ -283,6 +298,8 @@ class method object
283
298
anchor = "#### [`{}` {}](#{})" .format (name , func_kind , frag )
284
299
local_md .append (anchor )
285
300
301
+ func_meta ["ns_path" ] = frag
302
+
286
303
# link to source code in Git repo
287
304
code = obj .__code__
288
305
line_num = code .co_firstlineno
@@ -291,6 +308,8 @@ class method object
291
308
src_url = "[*\[source\]*]({}{}#L{})\n " .format (self .git_url , file , line_num ) # pylint: disable=W1401
292
309
local_md .append (src_url )
293
310
311
+ func_meta ["line_num" ] = line_num
312
+
294
313
# format the callable signature
295
314
sig = inspect .signature (obj )
296
315
arg_list = self .get_arg_list (sig )
@@ -300,6 +319,8 @@ class method object
300
319
local_md .append ("{}({})" .format (name , arg_list_str ))
301
320
local_md .append ("```" )
302
321
322
+ func_meta ["arg_list_str" ] = arg_list_str
323
+
303
324
# include the docstring, with return annotation
304
325
arg_dict : dict = {
305
326
name .split ("=" )[0 ]: anno
@@ -313,9 +334,13 @@ class method object
313
334
if ret :
314
335
arg_dict ["returns" ] = self .extract_type_annotation (ret )
315
336
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 )
317
339
local_md .append ("" )
318
340
341
+ func_meta ["arg_dict" ] = arg_dict
342
+ func_meta ["arg_docstring" ] = arg_docstring
343
+
319
344
return line_num , local_md
320
345
321
346
@@ -419,17 +444,24 @@ def document_type (
419
444
"""
420
445
local_md : typing .List [str ] = []
421
446
447
+ type_meta = {}
448
+ self .meta ["type" ][name ] = type_meta
449
+
422
450
# format a header + anchor
423
451
frag = "." .join (path_list + [ name ])
424
452
anchor = "#### [`{}` {}](#{})" .format (name , "type" , frag )
425
453
local_md .append (anchor )
426
454
455
+ type_meta ["ns_path" ] = frag
456
+
427
457
# show type definition
428
458
local_md .append ("```python" )
429
459
local_md .append ("{} = {}" .format (name , obj ))
430
460
local_md .append ("```" )
431
461
local_md .append ("" )
432
462
463
+ type_meta ["obj" ] = obj
464
+
433
465
return local_md
434
466
435
467
@@ -482,14 +514,21 @@ class object
482
514
docstring = class_obj .__doc__
483
515
src = inspect .getsourcelines (class_obj )
484
516
517
+ class_meta = {
518
+ "docstring" : docstring ,
519
+ "method" : {},
520
+ }
521
+
522
+ self .meta ["class" ][class_name ] = class_meta
523
+
485
524
if docstring :
486
525
# add the raw docstring for a class
487
526
self .md .append (docstring )
488
527
489
528
obj_md_pos : typing .Dict [int , typing .List [str ]] = {}
490
529
491
530
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 ]
493
532
494
533
if member_name .startswith ("__" ) or not member_name .startswith ("_" ):
495
534
if member_name not in class_obj .__dict__ :
@@ -503,7 +542,10 @@ class object
503
542
else :
504
543
continue
505
544
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 )
507
549
line_num = self .find_line_num (src , member_name )
508
550
obj_md_pos [line_num ] = obj_md
509
551
@@ -515,32 +557,35 @@ def format_functions (
515
557
self
516
558
) -> None :
517
559
"""
518
- Walk the module tree, and for each function definition format its
560
+ Walk the package tree, and for each function definition format its
519
561
apidocs as markdown.
520
562
"""
521
563
self .md .append ("---" )
522
- self .md .append ("## [module functions](#{})" .format (self .module_name ))
564
+ self .md .append ("## [package functions](#{})" .format (self .package_name ))
523
565
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 ):
525
567
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 )
527
572
self .md .extend (obj_md )
528
573
529
574
530
575
def format_types (
531
576
self
532
577
) -> None :
533
578
"""
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
535
580
as markdown.
536
581
"""
537
582
self .md .append ("---" )
538
- self .md .append ("## [module types](#{})" .format (self .module_name ))
583
+ self .md .append ("## [package types](#{})" .format (self .package_name ))
539
584
540
- for name , obj in inspect .getmembers (self .module_obj ):
585
+ for name , obj in inspect .getmembers (self .package_obj ):
541
586
if obj .__class__ .__module__ == "typing" :
542
587
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 )
544
589
self .md .extend (obj_md )
545
590
546
591
@@ -565,7 +610,7 @@ def render_apidocs ( # pylint: disable=R0914
565
610
returns:
566
611
rendered Markdown
567
612
"""
568
- module_name = local_config ["apidocs" ]["module " ]
613
+ package_name = local_config ["apidocs" ]["package " ]
569
614
git_url = local_config ["apidocs" ]["git" ]
570
615
571
616
includes = [
@@ -574,7 +619,7 @@ def render_apidocs ( # pylint: disable=R0914
574
619
]
575
620
576
621
pkg_doc = PackageDoc (
577
- module_name ,
622
+ package_name ,
578
623
git_url ,
579
624
includes ,
580
625
)
0 commit comments