Add geiger_counter_visualizer/src/geiger_counter_visualizer/cli.py

This commit is contained in:
Mika 2026-05-24 02:06:20 +00:00
parent 5e0b6cb049
commit 32829c31c6

View file

@ -0,0 +1,65 @@
import argparse
import json
import sys
from pathlib import Path
from typing import List
from geiger_counter_visualizer import core
def _load_data(input_path: Path) -> List[core.DataPoint]:
"""Lädt und validiert Geigerzählerdaten aus einer JSON-Datei."""
if not input_path.exists() or not input_path.is_file():
raise FileNotFoundError(f"Eingabedatei '{input_path}' wurde nicht gefunden.")
with input_path.open(encoding="utf-8") as f:
try:
raw = json.load(f)
except json.JSONDecodeError as e:
raise ValueError(f"Fehler beim Parsen der JSON-Datei: {e}") from e
if not isinstance(raw, list):
raise TypeError("Erwartete eine Liste von Datenobjekten im JSON-Root.")
datapoints = []
for item in raw:
if not isinstance(item, dict):
raise TypeError("Jedes Item der Datenliste muss ein Objekt (dict) sein.")
try:
dp = core.DataPoint(
timestamp=item["timestamp"],
count=int(item["count"]),
frequency=float(item["frequency"])
)
except (KeyError, ValueError, TypeError) as e:
raise ValueError(f"Ungültige Datenstruktur in Eintrag: {item}") from e
datapoints.append(dp)
assert datapoints, "Es wurden keine gültigen Datenpunkte geladen."
return datapoints
def main() -> None:
"""CLI-Einstiegspunkt für die Geigerzähler-Visualisierung."""
parser = argparse.ArgumentParser(
description="Visualisiert Geigerzählerdaten aus einer JSON-Datei in Echtzeit."
)
parser.add_argument(
"--input",
required=True,
help="Pfad zur JSON-Datei mit Geigerzählerdaten zur Visualisierung."
)
args = parser.parse_args()
input_path = Path(args.input)
try:
data = _load_data(input_path)
print(f"{len(data)} Datenpunkte erfolgreich geladen. Starte Visualisierung...")
core.visualize_data(data)
except Exception as exc:
print(f"Fehler: {exc}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()