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