1"""Rendering formatter parameter handling."""
2
3import typing
4
5from . import base
6
7__all__ = ['FORMATTERS', 'verify_formatter', 'Formatter']
8
9FORMATTERS = {'cairo',
10 'core',
11 'gd',
12 'gdiplus',
13 'gdwbmp',
14 'xlib'}
15
16REQUIRED = False
17
18
19def verify_formatter(formatter: typing.Optional[str], *,
20 required: bool = REQUIRED) -> None:
21 if formatter is None:
22 if required:
23 raise ValueError('missing formatter')
24 elif formatter.lower() not in FORMATTERS:
25 raise ValueError(f'unknown formatter: {formatter!r}'
26 f' (must be None or one of {sorted(FORMATTERS)})')
27
28
29class Formatter(base.ParameterBase):
30 """Rendering engine parameter (no default)."""
31
32 _formatter = None
33
34 _verify_formatter = staticmethod(verify_formatter)
35
36 def __init__(self, *, formatter: typing.Optional[str] = None, **kwargs) -> None:
37 super().__init__(**kwargs)
38
39 self.formatter = formatter
40
41 def _copy_kwargs(self, **kwargs):
42 """Return the kwargs to create a copy of the instance."""
43 formatter = self._getattr_from_dict('_formatter')
44 if formatter is not None:
45 kwargs['formatter'] = formatter
46 return super()._copy_kwargs(**kwargs)
47
48 @property
49 def formatter(self) -> typing.Optional[str]:
50 """The output formatter used for rendering
51 (``'cairo'``, ``'gd'``, ...)."""
52 return self._formatter
53
54 @formatter.setter
55 def formatter(self, formatter: typing.Optional[str]) -> None:
56 if formatter is None:
57 self.__dict__.pop('_formatter', None)
58 else:
59 formatter = formatter.lower()
60 self._verify_formatter(formatter)
61 self._formatter = formatter