1
- from autodoc_traits import ConfigurableDocumenter , TraitDocumenter
1
+ """
2
+ A modified version of https://github.com/jupyterhub/autodoc-traits/tree/1.2.2
3
+ for documenting trait fields that are used to configure another object, but
4
+ where the traitlet cannot be set directly.
5
+
6
+ This is used to generate the Server Process options documentation:
7
+ https://github.com/jupyterhub/jupyter-server-proxy/blob/main/docs/source/server-process.md
8
+ """
9
+
2
10
from sphinx .application import Sphinx
3
- from sphinx .ext .autodoc import SUPPRESS , ClassDocumenter , ObjectMember
11
+ from sphinx .ext .autodoc import (
12
+ SUPPRESS ,
13
+ AttributeDocumenter ,
14
+ ClassDocumenter ,
15
+ ObjectMember ,
16
+ )
4
17
from sphinx .util .typing import ExtensionMetadata
5
- from traitlets import Undefined
18
+ from traitlets import MetaHasTraits , TraitType , Undefined
19
+
6
20
21
+ class ServerProcessConfigurableDocumenter (ClassDocumenter ):
22
+ """
23
+ A modified version of autodoc_traits.ConfigurableDocumenter that only documents
24
+ the traits in this class, not the inherited traits.
25
+ https://github.com/jupyterhub/autodoc-traits/blob/1.2.2/autodoc_traits.py#L20-L122
26
+ """
7
27
8
- class ServerProcessConfigurableDocumenter (ConfigurableDocumenter ):
9
28
objtype = "serverprocessconfigurable"
10
29
directivetype = "class"
11
- priority = 100
30
+ priority = 100 # higher priority than ClassDocumenter's 10
31
+
32
+ @classmethod
33
+ def can_document_member (cls , member , membername , isattr , parent ):
34
+ return isinstance (member , MetaHasTraits )
12
35
13
36
def get_object_members (self , want_all ):
14
37
"""
@@ -21,20 +44,27 @@ def get_object_members(self, want_all):
21
44
def should_suppress_directive_header ():
22
45
return True
23
46
24
- # Skip over autodoc_traits otherwise it'll prepend c.ServerProcess
25
- # to the annotation
26
47
def add_directive_header (self , sig ):
27
48
print (f"{ sig = } " )
28
49
self .options .annotation = SUPPRESS
29
- super (ClassDocumenter , self ).add_directive_header (sig )
50
+ super ().add_directive_header (sig )
51
+
30
52
53
+ class ServerProcessTraitDocumenter (AttributeDocumenter ):
54
+ """
55
+ A modified version of autodoc_traits.TraitDocumenter that omits the c.ClassName prefix
56
+ https://github.com/jupyterhub/autodoc-traits/blob/1.2.2/autodoc_traits.py#L125-L203
57
+ """
31
58
32
- class ServerProcessTraitDocumenter (TraitDocumenter ):
33
59
objtype = "serverprocesstrait"
34
60
directivetype = "attribute"
35
61
priority = 100 # AttributeDocumenter has 10
36
62
member_order = 0 # AttributeDocumenter has 60
37
63
64
+ @classmethod
65
+ def can_document_member (cls , member , membername , isattr , parent ):
66
+ return isinstance (member , TraitType )
67
+
38
68
def add_directive_header (self , sig ):
39
69
default_value = self .object .default_value
40
70
if default_value is Undefined :
@@ -44,13 +74,11 @@ def add_directive_header(self, sig):
44
74
45
75
traitlets_type = self .object .__class__ .__name__
46
76
self .options .annotation = f"{ traitlets_type } ({ default_value } )"
47
- # Skip over autodoc_traits otherwise it'll prepend c.ServerProcess
48
- # to the annotation
49
- super (TraitDocumenter , self ).add_directive_header (sig )
77
+ super ().add_directive_header (sig )
50
78
51
79
52
80
def setup (app : Sphinx ) -> ExtensionMetadata :
53
- app .setup_extension ("autodoc_traits " )
81
+ app .setup_extension ("sphinx.ext.autodoc " )
54
82
app .add_autodocumenter (ServerProcessConfigurableDocumenter )
55
83
app .add_autodocumenter (ServerProcessTraitDocumenter )
56
84
return {
0 commit comments