Coverage for src/minihtml/_template_context.py: 100%
36 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-04-06 18:07 +0200
« prev ^ index » next coverage.py v7.6.12, created at 2025-04-06 18:07 +0200
1from collections.abc import Iterable, Iterator, Sequence
2from contextlib import contextmanager
3from contextvars import ContextVar
4from dataclasses import dataclass, field
6from ._core import Node
9@dataclass
10class TemplateContext:
11 _styles: dict[int, Node] = field(default_factory=dict)
12 _scripts: dict[int, Node] = field(default_factory=dict)
14 def add_style(self, node: Node):
15 self._styles[id(node)] = node
17 def add_script(self, node: Node):
18 self._scripts[id(node)] = node
20 @property
21 def styles(self) -> Iterable[Node]:
22 return self._styles.values()
24 @property
25 def scripts(self) -> Iterable[Node]:
26 return self._scripts.values()
29_template_context = ContextVar[TemplateContext]("template_context")
32def register_template_styles(nodes: Sequence[Node]) -> None:
33 if ctx := _template_context.get(None):
34 for node in nodes:
35 ctx.add_style(node)
38def register_template_scripts(nodes: Sequence[Node]) -> None:
39 if ctx := _template_context.get(None):
40 for node in nodes:
41 ctx.add_script(node)
44def get_template_context() -> TemplateContext:
45 return _template_context.get()
48@contextmanager
49def template_context() -> Iterator[None]:
50 token = _template_context.set(TemplateContext())
51 try:
52 yield
53 finally:
54 _template_context.reset(token)