1"""Rendering renderer parameter handling."""
2
3from collections.abc import Set
4from typing import Final
5
6from . import base
7
8__all__ = ['RENDERERS', 'verify_renderer', 'Renderer']
9
10RENDERERS: Final[Set[str]] = {'cairo', # $ dot -T:
11 'dot',
12 'fig',
13 'gd',
14 'gdiplus',
15 'map',
16 'pic',
17 'pov',
18 'ps',
19 'svg',
20 'tk',
21 'vml',
22 'vrml',
23 'xdot'}
24
25
26REQUIRED: Final = False
27
28
29def verify_renderer(renderer: str | None, *,
30 required: bool = REQUIRED) -> None:
31 if renderer is None:
32 if required:
33 raise ValueError('missing renderer')
34 elif renderer.lower() not in RENDERERS:
35 raise ValueError(f'unknown renderer: {renderer!r}'
36 f' (must be None or one of {sorted(RENDERERS)})')
37
38
39class Renderer(base.ParameterBase):
40 """Rendering renderer parameter (no default)."""
41
42 _renderer = None
43
44 _verify_renderer = staticmethod(verify_renderer)
45
46 def __init__(self, *, renderer: str | None = None, **kwargs) -> None:
47 super().__init__(**kwargs)
48
49 self.renderer = renderer
50
51 def _copy_kwargs(self, **kwargs):
52 """Return the kwargs to create a copy of the instance."""
53 renderer = self._getattr_from_dict('_renderer')
54 if renderer is not None:
55 kwargs['renderer'] = renderer
56 return super()._copy_kwargs(**kwargs)
57
58 @property
59 def renderer(self) -> str | None:
60 """The output renderer used for rendering
61 (``'cairo'``, ``'gd'``, ...)."""
62 return self._renderer
63
64 @renderer.setter
65 def renderer(self, renderer: str | None) -> None:
66 if renderer is None:
67 self.__dict__.pop('_renderer', None)
68 else:
69 renderer = renderer.lower()
70 self._verify_renderer(renderer)
71 self._renderer = renderer