from importlib.metadata import entry_points import logging from typing import Any from pydantic import BaseModel from oidc_test.models import User logger = logging.getLogger("registry") class ProcessResult(BaseModel): result: dict[str, Any] = {} class ProcessError(Exception): pass class ResourceProvider(BaseModel): scope_required: str | None = None default_resource_id: str | None = None def __init__(self, name: str): super().__init__() self.__name__ = name async def process(self, user: User, resource_id: str | None = None) -> ProcessResult: logger.warning(f"{self.__name__} should define a process method") return ProcessResult() class ResourceRegistry(BaseModel): resource_providers: dict[str, ResourceProvider] = {} def make_registry(self): for ep in entry_points().select(group="oidc_test.resource_provider"): ResourceProviderClass = ep.load() if issubclass(ResourceProviderClass, ResourceProvider): self.resource_providers[ep.name] = ResourceProviderClass(ep.name) registry = ResourceRegistry()