Add artifact1/src/artifact1/cli.py
This commit is contained in:
parent
4b8fe96731
commit
eac4e0749b
1 changed files with 100 additions and 0 deletions
100
artifact1/src/artifact1/cli.py
Normal file
100
artifact1/src/artifact1/cli.py
Normal file
|
|
@ -0,0 +1,100 @@
|
|||
import argparse
|
||||
import json
|
||||
import logging
|
||||
from pathlib import Path
|
||||
from typing import Any, Dict
|
||||
|
||||
from artifact1.core import analyze_metrics
|
||||
|
||||
|
||||
def _setup_logger() -> None:
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format="%(asctime)s [%(levelname)s] %(message)s",
|
||||
)
|
||||
|
||||
|
||||
def _validate_input_data(data: Any) -> Dict[str, Any]:
|
||||
if not isinstance(data, dict):
|
||||
raise ValueError("Input JSON must contain an object at root level.")
|
||||
|
||||
required_fields = [
|
||||
"max_only_alerts",
|
||||
"outlier_frequency",
|
||||
"expires_at_dist_hours",
|
||||
"retry_total_overhead",
|
||||
]
|
||||
|
||||
for field in required_fields:
|
||||
if field not in data:
|
||||
raise ValueError(f"Missing required field '{field}' in input data.")
|
||||
|
||||
if not isinstance(data["max_only_alerts"], int):
|
||||
raise TypeError("'max_only_alerts' must be an integer.")
|
||||
|
||||
for float_field in [
|
||||
"outlier_frequency",
|
||||
"expires_at_dist_hours",
|
||||
"retry_total_overhead",
|
||||
]:
|
||||
if not isinstance(data[float_field], (int, float)):
|
||||
raise TypeError(f"'{float_field}' must be a number (float or int).")
|
||||
|
||||
return data
|
||||
|
||||
|
||||
def main() -> None:
|
||||
_setup_logger()
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Resonanzband Performance Analyse CLI"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--input",
|
||||
required=True,
|
||||
help="Pfad zur JSON-Eingabedatei mit Performance-Daten.",
|
||||
type=str,
|
||||
)
|
||||
parser.add_argument(
|
||||
"--output",
|
||||
required=True,
|
||||
help="Pfad zur JSON-Ausgabedatei mit Analyseergebnissen.",
|
||||
type=str,
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
input_path = Path(args.input)
|
||||
output_path = Path(args.output)
|
||||
|
||||
if not input_path.exists():
|
||||
logging.error(f"Input file not found: {input_path}")
|
||||
raise FileNotFoundError(f"Input file not found: {input_path}")
|
||||
|
||||
logging.info(f"Loading performance data from {input_path}...")
|
||||
|
||||
with input_path.open("r", encoding="utf-8") as f:
|
||||
try:
|
||||
data = json.load(f)
|
||||
except json.JSONDecodeError as e:
|
||||
logging.error(f"Invalid JSON structure: {e}")
|
||||
raise
|
||||
|
||||
validated_data = _validate_input_data(data)
|
||||
|
||||
logging.info("Running performance analysis...")
|
||||
results = analyze_metrics(validated_data)
|
||||
|
||||
assert isinstance(results, dict), "analyze_metrics must return a dict"
|
||||
|
||||
logging.info(f"Writing analysis results to {output_path}...")
|
||||
output_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
with output_path.open("w", encoding="utf-8") as f:
|
||||
json.dump(results, f, indent=2, ensure_ascii=False)
|
||||
|
||||
logging.info("Analysis complete. Results saved successfully.")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Loading…
Reference in a new issue