Source code for peyk.flags

from __future__ import annotations
from collections.abc import Callable, Mapping
from dataclasses import dataclass
from typing import TypeVar
T = TypeVar('T', bound=Callable[..., object])

[docs] @dataclass(frozen=True) class FlagDecorator: """FlagDecorator defines a public API type for peyk.""" name: str value: object def __call__(self, handler: T) -> T: flags = dict(getattr(handler, '__peyk_flags__', {})) flags[self.name] = self.value setattr(handler, '__peyk_flags__', flags) return handler
[docs] class Flags: """Factory for handler flags used by dispatcher middleware.""" def __getattr__(self, name: str) -> Callable[[object], FlagDecorator]: def decorator(value: object=True) -> FlagDecorator: return FlagDecorator(name, value) return decorator
def _flags_from(handler: object) -> dict[str, object]: return dict(getattr(handler, '__peyk_flags__', {}))
[docs] def get_flag(handler: object, name: str, default: object=None) -> object: """Return one registered handler flag.""" return _flags_from(handler).get(name, default)
[docs] def check_flags(flags: Mapping[str, object], required: Mapping[str, object] | None=None) -> bool: """Check that every requested flag exists and matches its required value.""" if required is None: return True return all((flags.get(name) == value for name, value in required.items()))
flags = Flags() __all__ = ['FlagDecorator', 'Flags', 'check_flags', 'flags', 'get_flag']