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