# SPDX-FileCopyrightText: 2025 2025 # SPDX-FileContributor: Gergely Polonkai # # SPDX-License-Identifier: GPL-3.0-or-later """Oracle base class and related utilities""" from abc import ABCMeta, abstractmethod from typing import Any class Oracle(metaclass=ABCMeta): # pylint: disable=too-few-public-methods """Base class for Oracles""" TYPE_MARKER: str def __init__(self, oracle_data: dict[str, Any]) -> None: self.name: str | None = None self.source: str | None = None self.source_url: str | None = None self.parse_and_validate(oracle_data) def parse_and_validate(self, oracle_data: dict[str, Any]) -> None: """Parse and validate ``oracle_data``, essentially setting up the Oracle""" if "type" not in oracle_data: raise KeyError("type") if "name" not in oracle_data: raise KeyError("name") if "source" not in oracle_data: raise KeyError("source") if (data_type := oracle_data["type"]) != self.TYPE_MARKER: raise TypeError(f"This class can only handle {self.TYPE_MARKER} data, not {data_type}") self.name = oracle_data["name"] self.source = oracle_data["source"] self.source_url = oracle_data.get("source-url") @abstractmethod def generate(self) -> str: # pragma: no cover """Make the Oracle do its work""" raise NotImplementedError()