Skip to content

Commit 78c0e76

Browse files
committed
fix metrics file parsing
1 parent 035fb72 commit 78c0e76

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

commitloom/services/metrics.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,9 @@ def _save_metrics(self, metrics: CommitMetrics) -> None:
122122
try:
123123
with open(self._metrics_file) as f:
124124
metrics_list = json.load(f)
125+
if not isinstance(metrics_list, list):
126+
logger.warning("Invalid metrics file format, creating new file")
127+
metrics_list = []
125128
except (json.JSONDecodeError, FileNotFoundError) as e:
126129
logger.warning(f"Failed to load metrics, creating new file: {str(e)}")
127130
metrics_list = []

tests/test_metrics.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import json
2+
from datetime import timedelta
3+
4+
from commitloom.services.metrics import metrics_manager, CommitMetrics
5+
6+
7+
def test_save_metrics_with_invalid_file(tmp_path, monkeypatch):
8+
metrics_file = tmp_path / "metrics.json"
9+
metrics_file.write_text("{}") # invalid structure (dict instead of list)
10+
monkeypatch.setattr(metrics_manager, "_metrics_file", metrics_file)
11+
12+
metric = CommitMetrics(files_changed=1)
13+
# Should not raise even though existing file is invalid
14+
metrics_manager._save_metrics(metric)
15+
16+
data = json.loads(metrics_file.read_text())
17+
assert isinstance(data, list)
18+
assert data[0]["files_changed"] == 1
19+
20+
21+
def test_format_timedelta_outputs():
22+
td = timedelta(days=1, hours=2, minutes=30)
23+
result = metrics_manager._format_timedelta(td)
24+
assert "1 day" in result
25+
assert "2 hours" in result
26+
assert "30 minutes" in result
27+
28+
29+
def test_get_statistics(tmp_path, monkeypatch):
30+
metrics_file = tmp_path / "metrics.json"
31+
stats_file = tmp_path / "stats.json"
32+
monkeypatch.setattr(metrics_manager, "_metrics_file", metrics_file)
33+
monkeypatch.setattr(metrics_manager, "_stats_file", stats_file)
34+
35+
metrics_manager.start_commit_tracking("repo")
36+
metrics_manager.finish_commit_tracking(
37+
files_changed=1,
38+
tokens_used=10,
39+
prompt_tokens=5,
40+
completion_tokens=5,
41+
cost_in_eur=0.01,
42+
model_used="gpt-test",
43+
)
44+
45+
stats = metrics_manager.get_statistics()
46+
assert stats["total_commits"] >= 1
47+

0 commit comments

Comments
 (0)