Source code for domilite.flags

import copy
import enum
from enum import auto
from typing import Any
from typing import Self

__all__ = ["auto", "Flag"]


[docs] class Flag(enum.Flag): """ A base-class for flags with two extensions: `is_...` methods and :meth:`with_arguments` """ def __getattr__(self, key: str) -> Any: if key.startswith("is_") and key[3:].upper() in type(self).__members__: target = type(self).__members__[key[3:].upper()] return target in self raise AttributeError(key) def with_arguments(self, **kwargs: bool | None) -> Self: """Returns a copy of this flag, having applied the arguments supplied as keywords. Keywords should be (case-insenstive) names of flag attributes, and their values should be booleans (which will force the returned flag to have that value) or `None` (which will be ignored).""" output = copy.copy(self) for key, value in kwargs.items(): target = type(self)[key.upper()] if value is True: output |= target elif value is False: output &= ~target elif value is None: pass else: # pragma: no cover raise TypeError(f"Unexpected argument value for flag: {value!r}") return output