from __future__ import annotations
import json
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from r2x_core import PluginContext
class ReEDSConfig:
def __init__(
self,
weather_year: int | None = None,
solve_year: int | None = None,
**kwargs: Any,
) -> None:
self.weather_year = weather_year
self.solve_year = solve_year
self.extra = kwargs
class ReEDSParser:
def __init__(
self, config: ReEDSConfig | None = None, data_store: Any | None = None, **_: Any
) -> None:
self.config = config
self.data_store = data_store
@classmethod
def from_context(cls, ctx: PluginContext) -> ReEDSParser:
return cls(config=ctx.config, data_store=ctx.store)
def build_system(self) -> str:
return '{"system": "reeds", "status": "ok"}'
def no_stdin_function() -> dict[str, str]:
return {"system": "reeds", "status": "function-no-stdin"}
def with_system_function(system) -> dict[str, str]:
data = getattr(system, "data", {})
if isinstance(data, str):
try:
data = json.loads(data)
except json.JSONDecodeError:
data = {}
source = data.get("system", "unknown")
return {"system": source, "status": "function-with-system"}
def system_with_sidecar():
from r2x_core.system import System
return System(
{
"system": "reeds",
"status": "with-sidecar",
"time_series": {"directory": "system_time_series"},
}
)
def mark_streamed_system(system):
system.data["status"] = "streamed"
return system
def noisy_json():
print("plugin diagnostic")
return {"status": "ok"}
def test_exporter(system):
if system.data.get("system") != "reeds":
raise ValueError("expected a ReEDS System")
return None
class ContextExporter:
def __init__(self, context):
self.context = context
@classmethod
def from_context(cls, ctx: PluginContext) -> "ContextExporter":
return cls(ctx)
def run(self) -> None:
system = self.context.system
if system is None or getattr(system, "data", {}).get("system") != "reeds":
raise ValueError("expected a ReEDS System in PluginContext.system")
return None