ranczo-energy-usage-scrapers/EnergyPriceFactory.py
Bartosz Wieczorek 166d64d51e init
2025-09-02 18:14:05 +02:00

33 lines
1.1 KiB
Python

# EnergyPriceFactory.py
from __future__ import annotations
import importlib
from typing import Any, cast, Type
from EnergyPrice import EnergyPriceBase
def create(name: str, /, **kwargs: Any) -> EnergyPriceBase:
"""
Convention:
module: EnergyPriceProvider.<Name>Provider
class: <Name>Provider
Example: create("TauronG13", rates={...})
"""
safe = "".join(ch for ch in name if ch.isalnum() or ch == "_")
module_name = f"EnergyPriceProvider.{safe}Provider"
class_name = f"{safe}Provider"
try:
mod = importlib.import_module(module_name)
except ModuleNotFoundError as e:
raise ValueError(f"Provider module not found: {module_name}") from e
try:
cls = getattr(mod, class_name)
except AttributeError as e:
raise ValueError(f"Provider class not found: {class_name} in {module_name}") from e
if not issubclass(cls, EnergyPriceBase):
raise TypeError(f"{class_name} must inherit EnergyCostBase")
ProviderCls = cast(Type[EnergyPriceBase], cls)
return ProviderCls(**kwargs) # type: ignore[arg-type]