Add artifact.metrics_analysis/src/artifact_metrics_analysis/cli.py
This commit is contained in:
parent
15010cd591
commit
8dd26f8a9f
1 changed files with 75 additions and 0 deletions
|
|
@ -0,0 +1,75 @@
|
|||
import argparse
|
||||
import json
|
||||
from pathlib import Path
|
||||
import logging
|
||||
from typing import Any
|
||||
from artifact_metrics_analysis.core import analyze_metrics
|
||||
|
||||
|
||||
def main() -> None:
|
||||
"""Command line interface for comparing Evidence Card metrics."""
|
||||
parser = argparse.ArgumentParser(
|
||||
description=(
|
||||
"Analyze and compare metrics between Evidence Card #40 and #42, "
|
||||
"producing a JSON summary of retry_tail_p99, band_width, and delta_band_width."
|
||||
)
|
||||
)
|
||||
parser.add_argument(
|
||||
"--card40", required=True, type=str,
|
||||
help="Path to JSON metrics file for Evidence Card #40"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--card42", required=True, type=str,
|
||||
help="Path to JSON metrics file for Evidence Card #42"
|
||||
)
|
||||
parser.add_argument(
|
||||
"--output", required=False, type=str,
|
||||
help="Path for the output JSON file (metrics comparison results)"
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format="[%(levelname)s] %(message)s"
|
||||
)
|
||||
|
||||
try:
|
||||
path_40 = Path(args.card40)
|
||||
path_42 = Path(args.card42)
|
||||
|
||||
if not path_40.exists() or not path_42.exists():
|
||||
raise FileNotFoundError("One or both input JSON files do not exist.")
|
||||
|
||||
with path_40.open('r', encoding='utf-8') as f40:
|
||||
card_data_40: dict[str, Any] = json.load(f40)
|
||||
with path_42.open('r', encoding='utf-8') as f42:
|
||||
card_data_42: dict[str, Any] = json.load(f42)
|
||||
|
||||
# Input validation
|
||||
assert isinstance(card_data_40, dict), "card_data_40 must be a dict"
|
||||
assert isinstance(card_data_42, dict), "card_data_42 must be a dict"
|
||||
|
||||
result = analyze_metrics(card_data_40, card_data_42)
|
||||
result_dict = result.to_dict() if hasattr(result, 'to_dict') else dict(result)
|
||||
|
||||
if args.output:
|
||||
out_path = Path(args.output)
|
||||
out_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
with out_path.open('w', encoding='utf-8') as outf:
|
||||
json.dump(result_dict, outf, indent=2)
|
||||
logging.info(f"Metrics comparison results written to {out_path}")
|
||||
else:
|
||||
print(json.dumps(result_dict, indent=2))
|
||||
|
||||
except AssertionError as ae:
|
||||
logging.error(f"Input validation failed: {ae}")
|
||||
except FileNotFoundError as fe:
|
||||
logging.error(f"File not found: {fe}")
|
||||
except json.JSONDecodeError as je:
|
||||
logging.error(f"Invalid JSON input: {je}")
|
||||
except Exception as exc:
|
||||
logging.error(f"Unexpected error: {exc}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Loading…
Reference in a new issue