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