little refactoring done

This commit is contained in:
Ayzen
2026-03-10 17:33:25 +03:00
parent 9c745f304e
commit 1f715ce22c
10 changed files with 520 additions and 245 deletions
+24 -26
View File
@@ -2,12 +2,19 @@
from __future__ import annotations
import json
from pathlib import Path
from typing import Any
from python_app.models.run_config_schema import ComboModel, RunConfigModel
from python_app.models.run_config_validation import as_dict, load_ring_payload, load_switch_payload
from python_app.models.run_config_validation import load_ring_payload, load_switch_payload
def _as_dict(value: Any, context: str) -> dict[str, Any]:
"""Validate payload node is object-like, treating missing values as empty object."""
if value is None:
return {}
if not isinstance(value, dict):
raise ValueError(f"{context} must be a JSON object")
return value
def run_config_from_dict(payload: dict[str, Any]) -> RunConfigModel:
@@ -15,19 +22,19 @@ def run_config_from_dict(payload: dict[str, Any]) -> RunConfigModel:
# Schema carries only minimal-safe fallbacks; operational defaults live in run_config.json.
model = RunConfigModel()
radar_payload = as_dict(payload.get("radar"), "radar")
sweep_payload = as_dict(radar_payload.get("sweep"), "radar.sweep")
switches_payload = as_dict(payload.get("switches"), "switches")
port1_payload = as_dict(switches_payload.get("port1"), "switches.port1")
port2_payload = as_dict(switches_payload.get("port2"), "switches.port2")
run_payload = as_dict(payload.get("run"), "run")
preprocess_payload = as_dict(payload.get("preprocess"), "preprocess")
rings_payload = as_dict(payload.get("rings"), "rings")
raw_ring_payload = as_dict(rings_payload.get("raw"), "rings.raw")
raw_tap_ring_payload = as_dict(rings_payload.get("raw_tap"), "rings.raw_tap")
pre_ring_payload = as_dict(rings_payload.get("preprocessed"), "rings.preprocessed")
pre_tap_ring_payload = as_dict(rings_payload.get("preprocessed_tap"), "rings.preprocessed_tap")
result_ring_payload = as_dict(rings_payload.get("results"), "rings.results")
radar_payload = _as_dict(payload.get("radar"), "radar")
sweep_payload = _as_dict(radar_payload.get("sweep"), "radar.sweep")
switches_payload = _as_dict(payload.get("switches"), "switches")
port1_payload = _as_dict(switches_payload.get("port1"), "switches.port1")
port2_payload = _as_dict(switches_payload.get("port2"), "switches.port2")
run_payload = _as_dict(payload.get("run"), "run")
preprocess_payload = _as_dict(payload.get("preprocess"), "preprocess")
rings_payload = _as_dict(payload.get("rings"), "rings")
raw_ring_payload = _as_dict(rings_payload.get("raw"), "rings.raw")
raw_tap_ring_payload = _as_dict(rings_payload.get("raw_tap"), "rings.raw_tap")
pre_ring_payload = _as_dict(rings_payload.get("preprocessed"), "rings.preprocessed")
pre_tap_ring_payload = _as_dict(rings_payload.get("preprocessed_tap"), "rings.preprocessed_tap")
result_ring_payload = _as_dict(rings_payload.get("results"), "rings.results")
model.radar.model = str(radar_payload.get("model", model.radar.model))
model.radar.serial = str(radar_payload.get("serial", model.radar.serial))
@@ -71,7 +78,7 @@ def run_config_from_dict(payload: dict[str, Any]) -> RunConfigModel:
model.combos = []
if isinstance(combos_payload, list):
for combo in combos_payload:
combo_payload = as_dict(combo, "run.combos[]")
combo_payload = _as_dict(combo, "run.combos[]")
model.combos.append(
ComboModel(
input=int(combo_payload.get("input", 0)),
@@ -82,15 +89,6 @@ def run_config_from_dict(payload: dict[str, Any]) -> RunConfigModel:
model.ensure_combos()
return model
def load_run_config(path: Path) -> RunConfigModel:
"""Load JSON config from path and decode into :class:`RunConfigModel`."""
payload = json.loads(path.read_text(encoding="utf-8"))
if not isinstance(payload, dict):
raise ValueError(f"Config root must be JSON object: {path}")
return run_config_from_dict(payload)
def run_config_to_dict(model: RunConfigModel) -> dict[str, Any]:
"""Encode :class:`RunConfigModel` to C++ pipeline-compatible JSON structure."""
model.ensure_combos()