46 lines
1.4 KiB
Python

# 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()