Source code for lories.components.context
# -*- coding: utf-8 -*-
"""
lories.components.context
~~~~~~~~~~~~~~~~~~~~~~~~~
"""
from __future__ import annotations
import logging
from typing import Callable, Optional, Type
from lories._core._component import Component, _Component, _ComponentContext # noqa
from lories.core.configs import Configurations
from lories.core.register import RegistratorContext, Registry
registry = Registry[_Component]()
# noinspection PyShadowingBuiltins
def register_component_type(
type: str,
*alias: str,
factory: Callable[[ComponentContext | Component, Optional[Configurations]], Component] = None,
replace: bool = False,
) -> Callable[[Type[Component]], Type[Component]]:
# noinspection PyShadowingNames
def _register(cls: Type[Component]) -> Type[Component]:
registry.register(cls, type, *alias, factory=factory, replace=replace)
return cls
return _register
[docs]
class ComponentContext(_ComponentContext, RegistratorContext[Component]):
@property
def _registry(self) -> Registry[Component]:
return registry
# noinspection PyShadowingBuiltins
def activate(self, filter: Optional[Callable[[Component], bool]] = None) -> None:
self._activate(*self.filter(filter))
def _activate(self, *component: Component) -> None:
for component in component:
if not component.is_enabled():
self._logger.debug(
f"Skipping to activate disabled {type(component).__name__} '{component.name}': {component.id}"
)
continue
self.__activate(component)
def __activate(self, component: Component) -> None:
self._logger.debug(f"Activating {type(component).__name__} '{component.name}': {component.id}")
component.activate()
self._logger.info(f"Activated {type(component).__name__} '{component.name}': {component.id}")
# noinspection PyShadowingBuiltins
def deactivate(self, filter: Optional[Callable[[Component], bool]] = None) -> None:
self._deactivate(*self.filter(filter))
def _deactivate(self, *components: Component) -> None:
for component in reversed(list(components)):
if not component.is_active():
self._logger.debug(
f"Skipping to deactivate already deactivated {type(component).__name__} '{component.name}': "
f"{component.id}"
)
return
self.__deactivate(component)
def __deactivate(self, component: Component) -> None:
if not component.is_active():
self._logger.debug(
f"Skipping to deactivate already deactivated {type(component).__name__} '{component.name}': "
f"{component.id}"
)
return
try:
self._logger.debug(f"Deactivating {type(component).__name__} '{component.name}': {component.id}")
component.deactivate()
self._logger.info(f"Deactivated {type(component).__name__} '{component.name}': {component.id}")
except Exception as e:
self._logger.warning(f"Failed deactivating component '{component.id}': {str(e)}")
if self._logger.getEffectiveLevel() <= logging.DEBUG:
self._logger.exception(e)