Skip to content

Commit 3f00fd8

Browse files
fix(export): derive failure_count from failures list (PR #73 review)
1 parent 58b9581 commit 3f00fd8

2 files changed

Lines changed: 18 additions & 5 deletions

File tree

tests/test_cli_export_exit_codes.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@
1313
sys.path.insert(0, str(REPO_ROOT))
1414

1515
import scripts.export as export
16+
from models.error_codes import ErrorCode
1617
from tests.test_cli_e2e import _run_cli, _seed_base_dir
17-
from utils.export_engine import BulkExportResult
18+
from utils.export_engine import BulkExportResult, ExportFailure
1819
from utils.jsonl_parser import parse_session
1920

2021
_SUMMARY_RE = re.compile(
@@ -133,8 +134,17 @@ def _track_exit(result: BulkExportResult) -> None:
133134

134135

135136
def test_since_last_early_return_exits_one_on_failure(tmp_path, monkeypatch, capsys):
136-
"""Since-last early-return with failure_count>0 must produce real exit code 1."""
137-
fake_result = BulkExportResult(latest_day=None, failure_count=1)
137+
"""Since-last early-return with failures must produce real exit code 1."""
138+
fake_result = BulkExportResult(
139+
latest_day=None,
140+
failures=[
141+
ExportFailure(
142+
session_id="session_fail",
143+
message="Failed to parse session",
144+
code=ErrorCode.PARSE_ERROR,
145+
)
146+
],
147+
)
138148

139149
monkeypatch.setattr(export, "run_bulk_export", lambda **kwargs: fake_result)
140150
monkeypatch.setattr(export, "list_projects", lambda base: [{"name": "p", "path": "/p"}])

utils/export_engine.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ class BulkExportResult:
104104
manifest: list[dict[str, Any]] = field(default_factory=list)
105105
new_sessions_map: dict[str, float] = field(default_factory=dict)
106106
exported_session_count: int = 0
107-
failure_count: int = 0
108107
failures: list[ExportFailure] = field(default_factory=list)
109108
skipped_count: int = 0
110109
skipped_mtime_unchanged_count: int = 0
@@ -113,6 +112,11 @@ class BulkExportResult:
113112
latest_day_scan_total: int = 0
114113
latest_day_match_count: int = 0
115114

115+
@property
116+
def failure_count(self) -> int:
117+
"""Number of per-session failures (derived from :attr:`failures`)."""
118+
return len(self.failures)
119+
116120

117121
class ExportSink(Protocol):
118122
"""Receives exported session files and final manifest."""
@@ -305,7 +309,6 @@ def _record_failure(
305309
*,
306310
phase: Literal["parse", "export"] = "parse",
307311
) -> None:
308-
result.failure_count += 1
309312
code = failure_code_for_exception(exc, phase=phase)
310313
result.failures.append(
311314
ExportFailure(

0 commit comments

Comments
 (0)