Skip to content

Commit 740696c

Browse files
committed
refactor: Simplify extra context API
- Remove REGISTRY.source property (decorators handle registration) - Remove ExtraContextRegistry, ExtraContextGenerator, ExtraContext from __all__ - Change on_anytime to take env instead of app - Simplify ExtraContextGenerator by extracting _generate method - Fix 'Source' -> 'Extra Context' naming in comments and docs
1 parent 0d8e8ae commit 740696c

4 files changed

Lines changed: 19 additions & 44 deletions

File tree

docs/api.rst

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ See :doc:`tmpl` for the higher-level guide.
7575
.. autoclass:: sphinxnotes.render.Phase
7676
:members:
7777

78-
Sources
79-
-------
78+
Extra Context
79+
-------------
8080

8181
See :doc:`tmpl` for built-in extra-context names such as ``doc`` and
8282
``sphinx``, plus usage examples.
@@ -97,9 +97,6 @@ See :doc:`tmpl` for built-in extra-context names such as ``doc`` and
9797
.. autoclass:: sphinxnotes.render.GlobalExtraContext
9898
:members: generate
9999

100-
.. autoclass:: sphinxnotes.render.ExtraContextRegistry
101-
:members:
102-
103100

104101
Base Roles and Directives
105102
-------------------------
@@ -163,12 +160,11 @@ Registry
163160
========
164161

165162
Developers can extend this extension (for example, to support more data types
166-
or add new sources) by adding new items to
163+
or add new extra context) by adding new items to
167164
:py:class:`sphinxnotes.render.REGISTRY`.
168165

169166
.. autodata:: sphinxnotes.render.REGISTRY
170167

171168
.. autoclass:: sphinxnotes.render.Registry
172169

173170
.. autoproperty:: data
174-
.. autoproperty:: source

src/sphinxnotes/render/__init__.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,6 @@
3030
from .ctx import PendingContext, ResolvedContext
3131
from .ctxnodes import pending_node
3232
from .extractx import (
33-
ExtraContextRegistry,
34-
ExtraContextGenerator,
35-
ExtraContext,
3633
ParsingPhaseExtraContext,
3734
ParsedPhaseExtraContext,
3835
ResolvingPhaseExtraContext,
@@ -66,14 +63,11 @@
6663
'Host',
6764
'PendingContext',
6865
'ResolvedContext',
69-
'ExtraContext',
7066
'ParsingPhaseExtraContext',
7167
'ParsedPhaseExtraContext',
7268
'ResolvingPhaseExtraContext',
7369
'GlobalExtraContext',
7470
'extra_context',
75-
'ExtraContextRegistry',
76-
'ExtraContextGenerator',
7771
'pending_node',
7872
'BaseContextRole',
7973
'BaseContextDirective',
@@ -91,12 +85,6 @@ class Registry:
9185
def data(self) -> DataRegistry:
9286
return DATA_REGISTRY
9387

94-
@property
95-
def source(self) -> ExtraContextRegistry:
96-
from .extractx import REGISTRY as SOURCE_REGISTRY
97-
98-
return SOURCE_REGISTRY
99-
10088

10189
REGISTRY = Registry()
10290

src/sphinxnotes/render/extractx.py

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -208,41 +208,32 @@ def __init__(self, node: pending_node) -> None:
208208
)
209209
Reporter(node).append(self.report)
210210

211-
def on_anytime(self, app: Sphinx) -> None:
211+
def on_anytime(self, env: BuildEnvironment) -> None:
212212
"""Generate global extra context for requested names."""
213-
env = app.env
214-
for name in self.node.template.extra:
215-
ctx = REGISTRY.get(name)
216-
if ctx is not None and isinstance(ctx, GlobalExtraContext):
217-
self._safegen(name, lambda c=ctx: c.generate(env))
213+
self._generate(GlobalExtraContext, lambda ctx: ctx.generate(env))
218214

219215
def on_parsing(self, directive: SphinxDirective | SphinxRole) -> None:
220216
"""Generate parsing phase extra context for requested names."""
221-
for name in self.node.template.extra:
222-
ctx = REGISTRY.get(name)
223-
if ctx is not None and isinstance(ctx, ParsingPhaseExtraContext):
224-
self._safegen(name, lambda c=ctx: c.generate(directive))
217+
self._generate(ParsingPhaseExtraContext, lambda ctx: ctx.generate(directive))
225218

226219
def on_parsed(self, transform: SphinxTransform) -> None:
227220
"""Generate parsed phase extra context for requested names."""
228-
for name in self.node.template.extra:
229-
ctx = REGISTRY.get(name)
230-
if ctx is not None and isinstance(ctx, ParsedPhaseExtraContext):
231-
self._safegen(name, lambda c=ctx: c.generate(transform))
221+
self._generate(ParsedPhaseExtraContext, lambda ctx: ctx.generate(transform))
232222

233223
def on_resolving(self, transform: SphinxTransform) -> None:
234224
"""Generate resolving phase extra context for requested names."""
225+
self._generate(ResolvingPhaseExtraContext, lambda ctx: ctx.generate(transform))
226+
227+
def _generate(self, cls: type, gen: Callable[[ExtraContext], Any]) -> None:
228+
"""Generate extra context of the given type for all requested names."""
235229
for name in self.node.template.extra:
236230
ctx = REGISTRY.get(name)
237-
if ctx is not None and isinstance(ctx, ResolvingPhaseExtraContext):
238-
self._safegen(name, lambda c=ctx: c.generate(transform))
239-
240-
def _safegen(self, name: str, gen: Callable[[], Any]):
241-
try:
242-
self.node.extra[name] = gen()
243-
except Exception:
244-
self.report.text(f'Failed to generate extra context "{name}":')
245-
self.report.traceback()
231+
if ctx is not None and isinstance(ctx, cls):
232+
try:
233+
self.node.extra[name] = gen(ctx)
234+
except Exception:
235+
self.report.text(f'Failed to generate extra context "{name}":')
236+
self.report.traceback()
246237

247238

248239
def setup(app: Sphinx):

src/sphinxnotes/render/pipeline.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,8 @@ def render_queue(self, app: Sphinx) -> list[pending_node]:
121121
ns.append(pending)
122122
continue
123123

124-
# Generate global sources for later use.
125-
ExtraContextGenerator(pending).on_anytime(app)
124+
# Generate global extra context for later use.
125+
ExtraContextGenerator(pending).on_anytime(app.env)
126126

127127
host = cast(Host, self)
128128
pending.render(host)

0 commit comments

Comments
 (0)