Skip to content

Commit 4aa758a

Browse files
committed
docs: Autodoc improvements
1 parent fc17d0e commit 4aa758a

10 files changed

Lines changed: 113 additions & 60 deletions

File tree

docs/api.rst

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,32 @@
1-
=============
2-
API Reference
3-
=============
1+
==============
2+
API References
3+
==============
44

5-
Data Types
6-
==========
5+
Value, Data, Field and Schema
6+
=============================
77

88
.. autotype:: sphinxnotes.render.PlainValue
99
.. autotype:: sphinxnotes.render.Value
1010

1111
.. autoclass:: sphinxnotes.render.RawData
12+
:members: name, attrs, content
13+
:undoc-members:
14+
1215
.. autoclass:: sphinxnotes.render.ParsedData
16+
:members: name, attrs, content
17+
:undoc-members:
1318

1419
.. autoclass:: sphinxnotes.render.Field
20+
:members: parse
21+
1522
.. autoclass:: sphinxnotes.render.Schema
23+
:members: name, attrs, content
24+
:undoc-members:
1625

1726
.. autoclass:: sphinxnotes.render.data.Registry
27+
:members:
1828

19-
.. automethod:: add_type
20-
.. automethod:: add_form
21-
.. automethod:: add_flag
22-
.. automethod:: add_by_option
23-
24-
.. autotype:: sphinxnotes.render.data.ByOptionStore
29+
.. autotype:: sphinxnotes.render.data.ByOptionStore
2530

2631
The Render Pipeline
2732
===================
@@ -38,14 +43,21 @@ Context
3843
Extra Context
3944
-------------
4045

41-
.. autoclass:: sphinxnotes.render.ExtraContextGenerator
46+
.. autoclass:: sphinxnotes.render.GlobalExtraContxt
47+
.. autoclass:: sphinxnotes.render.ParsePhaseExtraContext
48+
.. autoclass:: sphinxnotes.render.ResolvePhaseExtraContext
49+
4250
.. autoclass:: sphinxnotes.render.ExtraContextRegistry
51+
:members:
4352

4453
Template
4554
--------
4655

4756
.. autoclass:: sphinxnotes.render.Template
57+
:members:
58+
4859
.. autoclass:: sphinxnotes.render.Phase
60+
:members:
4961

5062
Pipeline
5163
--------

docs/conf.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,17 @@
123123

124124
# CUSTOM CONFIGURATION
125125

126-
_ = extensions.pop() # no need to load extension
127-
primary_domain = 'py'
128-
129126
extensions.append('sphinx.ext.doctest')
127+
extensions.append('sphinxnotes.data')
128+
129+
autodoc_default_options = {
130+
'member-order': 'bysource',
131+
}
132+
133+
134+
intersphinx_mapping['python'] = ('https://docs.python.org/3', None)
135+
intersphinx_mapping['sphinx'] = ('https://www.sphinx-doc.org/en/master', None)
136+
137+
def setup(app):
138+
139+
app.add_object_type('event', 'event') # for intersphinx

docs/dsl.rst

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,17 @@
1-
=====================
2-
Field Declaration DSL
3-
=====================
1+
==========================
2+
Field Description Language
3+
==========================
44

55
.. default-domain:: py
66
.. highlight:: python
77
.. role:: py(code)
88
:language: Python
99

1010

11-
The Field Declaration DSL is a Domain Specific Language (DSL) that used to
12-
define the type and structure of field values. A DSL declaration consists of
11+
The Field Description Language is a Domain Specific Language (DSL) that used to
12+
define the type and structure of field values. An FDL declaration consists of
1313
one or more :term:`modifier`\ s separated by commas (``,``).
1414

15-
Python API
16-
==========
17-
18-
User can create a :class:`sphinxnotes.render.Field` from DSL and use it to parse
19-
string to :type:`sphinxnotes.render.Value`:
20-
21-
>>> from sphinxnotes.render import Field
22-
>>> Field.from_dsl('list of int').parse('1,2,3')
23-
[1, 2, 3]
24-
2515
Syntax
2616
======
2717

@@ -46,6 +36,17 @@ Syntax
4636
By-Option
4737
A key-value option
4838

39+
Python API
40+
==========
41+
42+
User can create a :class:`sphinxnotes.render.Field` from FDL and use it to parse
43+
string to :type:`sphinxnotes.render.Value`:
44+
45+
>>> from sphinxnotes.render import Field
46+
>>> Field.from_dsl('list of int').parse('1,2,3')
47+
[1, 2, 3]
48+
49+
4950
Type
5051
====
5152

@@ -179,10 +180,10 @@ DSL Input Result
179180
``int, sep by ':'`` ``1:2:3`` :py:`[1, 2, 3]`
180181
=================== ========= ================
181182

182-
Extending the DSL
183+
Extending the FDL
183184
=================
184185

185-
You can extend the DSL by registering custom types, flags, and by-options
186+
You can extend the FDL by registering custom types, flags, and by-options
186187
through the :attr:`~sphinxnotes.render.Registry.data` attribute of
187188
:data:`sphinxnotes.render.REGISTRY`.
188189

src/sphinxnotes/render/__init__.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,13 @@
2828
)
2929
from .ctx import PendingContext, ResolvedContext
3030
from .ctxnodes import pending_node
31-
from .extractx import ExtraContextRegistry, ExtraContextGenerator
31+
from .extractx import (
32+
ExtraContextRegistry,
33+
ExtraContextGenerator,
34+
GlobalExtraContxt,
35+
ParsePhaseExtraContext,
36+
ResolvePhaseExtraContext,
37+
)
3238
from .pipeline import BaseContextRole, BaseContextDirective
3339
from .sources import (
3440
UnparsedData,
@@ -56,6 +62,9 @@
5662
'Host',
5763
'PendingContext',
5864
'ResolvedContext',
65+
'GlobalExtraContxt',
66+
'ParsePhaseExtraContext',
67+
'ResolvePhaseExtraContext',
5968
'pending_node',
6069
'BaseContextRole',
6170
'BaseContextDirective',

src/sphinxnotes/render/ctx.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def __hash__(self) -> int:
3333
class PendingContext(ABC, Unpicklable, Hashable):
3434
"""A abstract representation of context that is not currently available.
3535
36-
Call :meth:`resolve` at the right time (depends on the implment) to get
36+
Call :py:meth:`resolve` at the right time (depends on the implment) to get
3737
context available.
3838
"""
3939

@@ -52,7 +52,7 @@ class PendingContextStorage:
5252
5353
This class maintains a mapping from :class:`PendingContextRef` -> :cls:`PendingContext`.
5454
``pending_node`` owns the ``PendingContextRef``, and can retrieve the context
55-
by calling :meth:`retrieve`.
55+
by calling :py:meth:`retrieve`.
5656
"""
5757

5858
_next_id: int

src/sphinxnotes/render/data.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ def add_type(
157157
strify: Callable[[PlainValue], str],
158158
aliases: list[str] = [],
159159
) -> None:
160-
"""Register a value type for :class:`PlainValue`.
160+
"""Register a value type for :py:class:`PlainValue`.
161161
162162
:param name: The name for this scalar type,
163163
available as a :term:`Type modifier` in the DSL
@@ -179,12 +179,12 @@ def add_form(
179179
self, name: str, ctype: type, sep: str, aliases: list[str] = []
180180
) -> None:
181181
"""Register an value form with its container type and separator for
182-
:class:`Value`.
182+
:py:class:`Value`.
183183
184184
:param name: The name for this form, available as a :term:`Form modifier`
185185
in the DSL
186186
:param ctype: The container type.
187-
(for now, it is :class:`list`, :class:`tuple`, or :class:`set`)
187+
(for now, it is :py:class:`list`, :py:class:`tuple`, or :py:class:`set`)
188188
:param sep: The separator string used to split/join values
189189
:param aliases: Alternative names for this form
190190
"""
@@ -273,10 +273,10 @@ def asdict(self) -> dict[str, Any]:
273273
``self.attrs`` will be automaticlly lifted to top-level context when
274274
there is no key conflicts. For example:
275275
276-
- You can access ``Data.attrs['color']`` by "{{ color }}"" instead
277-
of "{{ attrs.color }}".
276+
- You can access ``Data.attrs['color']`` by "{{ color }}" instead
277+
of "{{ attrs.color }}".
278278
- You can NOT access ``Data.attrs['name']`` by "{{ name }}" cause
279-
the variable name is taken by ``Data.name``.
279+
the variable name is taken by ``Data.name``.
280280
"""
281281
ctx = asdict(self)
282282
for k, v in self.attrs.items():

src/sphinxnotes/render/extractx.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,29 @@
1313
if TYPE_CHECKING:
1414
from typing import Any, Callable, ClassVar
1515
from sphinx.application import Sphinx
16-
from .render import ParseHost, TransformHost
16+
from .render import ParseHost, ResolveHost
1717

1818

1919
class GlobalExtraContxt(ABC):
20+
"""Extra context availabled on any phase."""
21+
2022
@abstractmethod
2123
def generate(self) -> Any: ...
2224

2325

2426
class ParsePhaseExtraContext(ABC):
27+
"""Extra context generated during the :py:class:`~Phase.Parsing` or
28+
:py:class:`~Phase.Parsing` phase."""
29+
2530
@abstractmethod
2631
def generate(self, host: ParseHost) -> Any: ...
2732

2833

29-
class TransformPhaseExtraContext(ABC):
34+
class ResolvePhaseExtraContext(ABC):
35+
"""Extra context generated during the :py:class:`~Phase.Resolving` phase."""
36+
3037
@abstractmethod
31-
def generate(self, host: TransformHost) -> Any: ...
38+
def generate(self, host: ResolveHost) -> Any: ...
3239

3340

3441
# =======================
@@ -39,8 +46,8 @@ def generate(self, host: TransformHost) -> Any: ...
3946
class ExtraContextRegistry:
4047
names: set[str]
4148
parsing: dict[str, ParsePhaseExtraContext]
42-
parsed: dict[str, TransformPhaseExtraContext]
43-
post_transform: dict[str, TransformPhaseExtraContext]
49+
parsed: dict[str, ResolvePhaseExtraContext]
50+
post_transform: dict[str, ResolvePhaseExtraContext]
4451
global_: dict[str, GlobalExtraContxt]
4552

4653
def __init__(self) -> None:
@@ -65,22 +72,26 @@ def _name_dedup(self, name: str) -> None:
6572
def add_parsing_phase_context(
6673
self, name: str, ctxgen: ParsePhaseExtraContext
6774
) -> None:
75+
"""Register a extra context for :py:class:`~Phase.Parsing` phase."""
6876
self._name_dedup(name)
6977
self.parsing['_' + name] = ctxgen
7078

7179
def add_parsed_phase_context(
72-
self, name: str, ctxgen: TransformPhaseExtraContext
80+
self, name: str, ctxgen: ResolvePhaseExtraContext
7381
) -> None:
82+
"""Register a extra context for :py:class:`~Phase.Parsed` phase."""
7483
self._name_dedup(name)
7584
self.parsed['_' + name] = ctxgen
7685

7786
def add_post_transform_phase_context(
78-
self, name: str, ctxgen: TransformPhaseExtraContext
87+
self, name: str, ctxgen: ResolvePhaseExtraContext
7988
) -> None:
89+
"""Register a extra context for :py:class:`~Phase.Resolving` phase."""
8090
self._name_dedup(name)
8191
self.post_transform['_' + name] = ctxgen
8292

8393
def add_global_context(self, name: str, ctxgen: GlobalExtraContxt):
94+
"""Register a extra context for :py:class:`~Phase.Resolving` phase."""
8495
self._name_dedup(name)
8596
self.global_['_' + name] = ctxgen
8697

@@ -162,11 +173,11 @@ def on_parsing(self, host: ParseHost) -> None:
162173
for name, ctxgen in self.registry.parsing.items():
163174
self._safegen(name, lambda: ctxgen.generate(host))
164175

165-
def on_parsed(self, host: TransformHost) -> None:
176+
def on_parsed(self, host: ResolveHost) -> None:
166177
for name, ctxgen in self.registry.parsed.items():
167178
self._safegen(name, lambda: ctxgen.generate(host))
168179

169-
def on_post_transform(self, host: TransformHost) -> None:
180+
def on_resolving(self, host: ResolveHost) -> None:
170181
for name, ctxgen in self.registry.post_transform.items():
171182
self._safegen(name, lambda: ctxgen.generate(host))
172183

src/sphinxnotes/render/pipeline.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
from sphinx.transforms import SphinxTransform
5454
from sphinx.transforms.post_transforms import SphinxPostTransform, ReferencesResolver
5555

56-
from .render import HostWrapper, Phase, Template, Host, ParseHost, TransformHost
56+
from .render import HostWrapper, Phase, Template, Host, ParseHost, ResolveHost
5757
from .ctx import PendingContext, ResolvedContext
5858
from .ctxnodes import pending_node
5959
from .extractx import ExtraContextGenerator
@@ -260,7 +260,7 @@ class ParsedHookTransform(SphinxTransform, Pipeline):
260260

261261
@override
262262
def process_pending_node(self, n: pending_node) -> bool:
263-
ExtraContextGenerator(n).on_parsed(cast(TransformHost, self))
263+
ExtraContextGenerator(n).on_parsed(cast(ResolveHost, self))
264264
return n.template.phase == Phase.Parsed
265265

266266
@override
@@ -278,7 +278,7 @@ class ResolvingHookTransform(SphinxPostTransform, Pipeline):
278278

279279
@override
280280
def process_pending_node(self, n: pending_node) -> bool:
281-
ExtraContextGenerator(n).on_post_transform(cast(TransformHost, self))
281+
ExtraContextGenerator(n).on_resolving(cast(ResolveHost, self))
282282
return n.template.phase == Phase.Resolving
283283

284284
@override

src/sphinxnotes/render/render.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,19 @@
77

88

99
class Phase(Enum):
10+
"""The phase of rendering template."""
11+
12+
#: Render template on document parsing.
1013
Parsing = 'parsing'
14+
#: Render template immediately after document has parsed
15+
#: (on Sphinx event :external:event:`doctree-read`).
1116
Parsed = 'parsed'
17+
#: Render template immediately after all documents have resolving
18+
#: (before Sphinx event :external:event:`doctree-resolved`).
1219
Resolving = 'resolving'
1320

1421
@classmethod
15-
def default(cls) -> 'Phase':
22+
def default(cls) -> Phase:
1623
return cls.Parsing
1724

1825

@@ -22,16 +29,16 @@ class Template:
2229
text: str
2330
#: The render phase.
2431
phase: Phase = Phase.default()
25-
#: Enable debug output (shown as :class:`nodes.system_message` in document.)
32+
#: Enable debug output (shown as :py:class:`docutils.nodes.system_message` in document.)
2633
debug: bool = False
2734

2835

29-
# Possible render host of :meth:`pending_node.render`.
30-
type Host = ParseHost | TransformHost
31-
# Host of source parse phase (Phase.Parsing, Phase.Parsed).
36+
#: Possible render host of :meth:`pending_node.render`.
37+
type Host = ParseHost | ResolveHost
38+
#: Host of source parse phase (Phase.Parsing, Phase.Parsed).
3239
type ParseHost = SphinxDirective | SphinxRole
33-
# Host of source parse phase (Phase.Parsing, Phase.Parsed).
34-
type TransformHost = SphinxTransform
40+
#: Host of source parse phase (Phase.Parsing, Phase.Parsed).
41+
type ResolveHost = SphinxTransform
3542

3643

3744
@dataclass

0 commit comments

Comments
 (0)