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

1from collections.abc import Iterable, Iterator, Sequence 

2from contextlib import contextmanager 

3from contextvars import ContextVar 

4from dataclasses import dataclass, field 

5 

6from ._core import Node 

7 

8 

9@dataclass 

10class TemplateContext: 

11 _styles: dict[int, Node] = field(default_factory=dict) 

12 _scripts: dict[int, Node] = field(default_factory=dict) 

13 

14 def add_style(self, node: Node): 

15 self._styles[id(node)] = node 

16 

17 def add_script(self, node: Node): 

18 self._scripts[id(node)] = node 

19 

20 @property 

21 def styles(self) -> Iterable[Node]: 

22 return self._styles.values() 

23 

24 @property 

25 def scripts(self) -> Iterable[Node]: 

26 return self._scripts.values() 

27 

28 

29_template_context = ContextVar[TemplateContext]("template_context") 

30 

31 

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) 

36 

37 

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) 

42 

43 

44def get_template_context() -> TemplateContext: 

45 return _template_context.get() 

46 

47 

48@contextmanager 

49def template_context() -> Iterator[None]: 

50 token = _template_context.set(TemplateContext()) 

51 try: 

52 yield 

53 finally: 

54 _template_context.reset(token)