from abc import ABC, abstractmethod from loguru import logger from pydantic import BaseModel from typing import Any, Self class AbstractModelMetaclass(type(BaseModel), type(ABC)): pass class AbstractBaseModel(BaseModel, ABC, metaclass=AbstractModelMetaclass): pass class ApplicationComponentBase(AbstractBaseModel): def __init__(self: Self, **data: dict[str, Any]) -> None: super().__init__(**data) logger.debug("Created {}", self.__class__.__name__) @property @abstractmethod def name(self: Self) -> str: pass class HealthReportingApplicationComponentBase(ApplicationComponentBase): @abstractmethod async def is_healthy(self: Self) -> bool: pass