Source code for kerno.utility_registry
"""A registry to store various utilities in an application."""
from configparser import NoSectionError
from types import MappingProxyType # behaves like a FrozenDict / frozendict
from typing import Any
from bag.settings import resolve
from kerno.kerno import Kerno
from kerno.typing import DictStr
[docs]class ConfigurationError(Exception):
"""Represents an error during application startup."""
[docs]class UtilityRegistryBuilder:
"""Gradually builds Kerno's utility registry, which is immutable."""
def __init__(self, kerno: Kerno):
"""Read the config section "kerno utilites"; register each utility."""
self.kerno = kerno
self._utilities: DictStr = {}
self.kerno.utilities = MappingProxyType(self._utilities)
try:
section = kerno.settings["kerno utilities"]
except (NoSectionError, KeyError):
return
for name, utility in section.items():
self.register(name, utility)
[docs] def register(self, name: str, utility: Any) -> Any:
"""Register ``utility`` under ``name`` at startup for later use."""
obj = resolve(utility)
# print('Registering ', name, utility, obj)
self._utilities[name] = obj
return obj
[docs] def set_default(self, name: str, utility: Any) -> Any:
"""Register ``utility`` as ``name`` only if name not yet registered."""
if self._utilities.get(name) is None:
return self.register(name, utility)
else:
return None
[docs] def ensure(self, name: str, component: str = "The application") -> None:
"""Raise if no utility has been registered under ``name``."""
if self._utilities.get(name) is None:
raise ConfigurationError(
f'{component} needs a utility called "{name}", '
"which has not been registered."
)