Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 8 additions & 17 deletions src/arbiter/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1071,19 +1071,6 @@ def cmd_diff(args: argparse.Namespace) -> None:
sys.exit(1)


def _score_to_grade(score: float) -> str:
"""Convert a numeric score to a letter grade."""
if score >= 90:
return "A"
if score >= 80:
return "B"
if score >= 70:
return "C"
if score >= 60:
return "D"
return "F"


def _compute_deltas(rows: list[dict]) -> list[dict]:
"""Add a 'delta' key to each row based on previous score for the same repo.

Expand Down Expand Up @@ -1131,20 +1118,24 @@ def cmd_history(args: argparse.Namespace) -> None:
print("|------|------|-------|-------|-------|")
for r in rows_with_delta:
ts = r["timestamp"][:10]
loc = r.get("total_loc", 0) or 0
score = r["overall_score"] or 0
grade = _score_to_grade(score)
print(f"| {ts} | {r['repo_name']} | {score:.1f} | {grade} | {r['delta']} |")
grade = _grade_score(score, loc)
score_str = "n/a" if loc <= 0 else f"{score:.1f}"
print(f"| {ts} | {r['repo_name']} | {score_str} | {grade} | {r['delta']} |")
return

# Default: plain text table
print(f"{'Date':12s} {'Repo':30s} {'Score':>6s} {'Grade':>6s} {'Delta':>8s}")
print("-" * 66)
for r in rows_with_delta:
ts = r["timestamp"][:10]
loc = r.get("total_loc", 0) or 0
score = r["overall_score"] or 0
grade = _score_to_grade(score)
grade = _grade_score(score, loc)
name = (r.get("repo_name") or "?")[:30]
print(f"{ts:12s} {name:30s} {score:6.1f} {grade:>6s} {r['delta']:>8s}")
score_str = "n/a" if loc <= 0 else f"{score:6.1f}"
print(f"{ts:12s} {name:30s} {score_str:>6s} {grade:>6s} {r['delta']:>8s}")
_print_footer()


Expand Down
23 changes: 14 additions & 9 deletions tests/test_history.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
cmd_trend_chart,
_compute_deltas,
_ascii_bar,
_score_to_grade,
_grade_score,
)


Expand Down Expand Up @@ -256,14 +256,19 @@ def test_trend_chart_empty(tmp_path: Path, capsys) -> None:


# ---------------------------------------------------------------------------
# _score_to_grade
# _grade_score
# ---------------------------------------------------------------------------


def test_score_to_grade() -> None:
assert _score_to_grade(95) == "A"
assert _score_to_grade(90) == "A"
assert _score_to_grade(85) == "B"
assert _score_to_grade(75) == "C"
assert _score_to_grade(65) == "D"
assert _score_to_grade(50) == "F"
def test_grade_score() -> None:
assert _grade_score(95, total_loc=100) == "A"
assert _grade_score(90, total_loc=100) == "A"
assert _grade_score(85, total_loc=100) == "B"
assert _grade_score(75, total_loc=100) == "C"
assert _grade_score(65, total_loc=100) == "D"
assert _grade_score(50, total_loc=100) == "F"
assert _grade_score(100, total_loc=0) == "N/A"

def test_grade_score_non_scorable() -> None:
assert _grade_score(100.0, total_loc=0) == "N/A"
assert _grade_score(0, total_loc=0) == "N/A"
Loading