33 lines
1.1 KiB
Python
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]
|