1"""Rendering format parameter handling.""" 
    2 
    3from collections.abc import Set 
    4from typing import Final 
    5 
    6from . import base 
    7 
    8__all__ = ['FORMATS', 'verify_format', 'Format'] 
    9 
    10FORMATS: Final[Set[str]] = {'bmp',  # https://graphviz.org/docs/outputs/ 
    11                            'canon', 'dot', 'gv', 'xdot', 'xdot1.2', 'xdot1.4', 
    12                            'cgimage', 
    13                            'cmap', 
    14                            'eps', 
    15                            'exr', 
    16                            'fig', 
    17                            'gd', 'gd2', 
    18                            'gif', 
    19                            'gtk', 
    20                            'ico', 
    21                            'imap', 'cmapx', 
    22                            'imap_np', 'cmapx_np', 
    23                            'ismap', 
    24                            'jp2', 
    25                            'jpg', 'jpeg', 'jpe', 
    26                            'json', 'json0', 'dot_json', 'xdot_json',  # Graphviz 2.40 
    27                            'pct', 'pict', 
    28                            'pdf', 
    29                            'pic', 
    30                            'plain', 'plain-ext', 
    31                            'png', 
    32                            'pov', 
    33                            'ps', 
    34                            'ps2', 
    35                            'psd', 
    36                            'sgi', 
    37                            'svg', 'svg_inline', 'svgz',  # svg_linline: Graphviz 10.0.1 
    38                            'tga', 
    39                            'tif', 'tiff', 
    40                            'tk', 
    41                            'vml', 'vmlz', 
    42                            'vrml', 
    43                            'wbmp', 
    44                            'webp', 
    45                            'xlib', 'x11'} 
    46 
    47DEFAULT_FORMAT: Final = 'pdf' 
    48 
    49REQUIRED: Final = True 
    50 
    51 
    52def verify_format(format: str, *, required: bool = REQUIRED) -> None: 
    53    if format is None: 
    54        if required: 
    55            raise ValueError('missing format') 
    56    elif format.lower() not in FORMATS: 
    57        raise ValueError(f'unknown format: {format!r}' 
    58                         f' (must be one of {sorted(FORMATS)})') 
    59 
    60 
    61class Format(base.ParameterBase): 
    62    """Rendering format parameter with ``'pdf'`` default.""" 
    63 
    64    _format = DEFAULT_FORMAT 
    65 
    66    _verify_format = staticmethod(verify_format) 
    67 
    68    def __init__(self, *, format: str | None = None, **kwargs) -> None: 
    69        super().__init__(**kwargs) 
    70 
    71        if format is not None: 
    72            self.format = format 
    73 
    74    def _copy_kwargs(self, **kwargs): 
    75        """Return the kwargs to create a copy of the instance.""" 
    76        format = self._getattr_from_dict('_format') 
    77        if format is not None: 
    78            kwargs['format'] = format 
    79        return super()._copy_kwargs(**kwargs) 
    80 
    81    @property 
    82    def format(self) -> str: 
    83        """The output format used for rendering 
    84            (``'pdf'``, ``'png'``, ...).""" 
    85        return self._format 
    86 
    87    @format.setter 
    88    def format(self, format: str) -> None: 
    89        format = format.lower() 
    90        self._verify_format(format) 
    91        self._format = format