Source code for simplebench.reporters.reporter_manager.decorators.register_reporter.register_reporter

"""``@register_reporter`` decorator and supporting functions."""
from simplebench.exceptions import SimpleBenchTypeError
from simplebench.reporters.reporter import Reporter
from simplebench.reporters.reporter_manager.decorators.register_reporter.exceptions import _RegisterReporterErrorTag

# reporters registered by clients via the @register_reporter decorator
_REGISTERED_REPORTER_TYPES: set[type[Reporter]] = set()
_REGISTERED_REPORTER_INSTANCES: set[Reporter] = set()
"""Class-level registry of all Reporter instances registered via the @register_reporter decorator."""


[docs] def register_reporter(cls: type[Reporter]) -> type[Reporter]: """Class decorator to register a :class:`~simplebench.reporters.reporter.Reporter` subclass. This decorator can be applied to any subclass of :class:`~simplebench.reporters.reporter.Reporter` to register it with the system. """ if not issubclass(cls, Reporter): raise SimpleBenchTypeError( "reporter_cls must be a subclass of Reporter", tag=_RegisterReporterErrorTag.INVALID_REPORTER_TYPE_ARG ) # non-base classes only because the base class cannot be instantiated without # required arguments and is not useful as a registered reporter by itself # This is mainly to prevent someone from trying to register the base Reporter class itself if cls is Reporter: raise SimpleBenchTypeError( "Cannot register the base Reporter class", tag=_RegisterReporterErrorTag.BASE_REPORTER_TYPE_ARG ) if cls in _REGISTERED_REPORTER_TYPES: # Already registered, do nothing return cls _REGISTERED_REPORTER_TYPES.add(cls) _REGISTERED_REPORTER_INSTANCES.add(cls()) # type: ignore[reportCallIssue, call-arg] return cls
[docs] def get_registered_reporters() -> set[Reporter]: """Get all :class:`~simplebench.reporters.reporter.Reporter` instances registered via the :func:`~.register_reporter` decorator. :return: A set of all registered :class:`~simplebench.reporters.reporter.Reporter` instances. :rtype: set[:class:`~simplebench.reporters.reporter.Reporter`] """ return _REGISTERED_REPORTER_INSTANCES
[docs] def clear_registered_reporters() -> None: """Clear all registered :class:`~simplebench.reporters.reporter.Reporter` instances. This is primarily intended for use in unit tests to reset the state between tests. """ _REGISTERED_REPORTER_INSTANCES.clear() _REGISTERED_REPORTER_TYPES.clear()