-
Notifications
You must be signed in to change notification settings - Fork 151
/
Copy pathserverprocess_documenter.py
58 lines (46 loc) · 1.78 KB
/
serverprocess_documenter.py
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
"""
A custom Sphinx directive to generate the Server Process options documentation:
https://github.com/jupyterhub/jupyter-server-proxy/blob/main/docs/source/server-process.md
"""
import importlib
from textwrap import dedent
from docutils import nodes
from sphinx.application import Sphinx
from sphinx.util.docutils import SphinxDirective
from sphinx.util.typing import ExtensionMetadata
from traitlets import Undefined
class ServerProcessDirective(SphinxDirective):
"""A directive to say hello!"""
required_arguments = 2
def run(self) -> list[nodes.Node]:
module = importlib.import_module(self.arguments[0], ".")
cls = getattr(module, self.arguments[1])
config_trait_members = cls.class_traits(config=True).items()
doc = []
for name, trait in config_trait_members:
default_value = trait.default_value
if default_value is Undefined:
default_value = ""
else:
default_value = repr(default_value)
traitlets_type = trait.__class__.__name__
help = self.parse_text_to_nodes(dedent(trait.metadata.get("help", "")))
definition = nodes.definition_list_item(
"",
nodes.term(
"",
"",
nodes.strong(text=f"{name}"),
nodes.emphasis(text=f" {traitlets_type}({default_value})"),
),
nodes.definition("", *help),
)
doc.append(nodes.definition_list("", definition))
return doc
def setup(app: Sphinx) -> ExtensionMetadata:
app.add_directive("serverprocess", ServerProcessDirective)
return {
"version": "0.1",
"parallel_read_safe": True,
"parallel_write_safe": True,
}