Skip to content

Commit 6de63c9

Browse files
committed
Add LongBridge dry-run report summary
1 parent 20a55a4 commit 6de63c9

2 files changed

Lines changed: 48 additions & 0 deletions

File tree

main.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,31 @@ def _split_env_list(value: str | None) -> tuple[str, ...]:
119119
)
120120

121121

122+
def _summarize_cycle_result_for_report(cycle_result, *, dry_run: bool) -> dict:
123+
if cycle_result is None:
124+
return {
125+
"action_done": False,
126+
"order_events_count": 0,
127+
"orders_previewed_count": 0,
128+
"orders_skipped_count": 0,
129+
"notes_count": 0,
130+
"dry_run_order_preview_available": False,
131+
}
132+
logs = tuple(getattr(cycle_result, "logs", ()) or ())
133+
skip_logs = tuple(getattr(cycle_result, "skip_logs", ()) or ())
134+
note_logs = tuple(getattr(cycle_result, "note_logs", ()) or ())
135+
order_events_count = len(logs)
136+
orders_previewed_count = order_events_count if dry_run else 0
137+
return {
138+
"action_done": bool(getattr(cycle_result, "action_done", False)),
139+
"order_events_count": order_events_count,
140+
"orders_previewed_count": orders_previewed_count,
141+
"orders_skipped_count": len(skip_logs),
142+
"notes_count": len(note_logs),
143+
"dry_run_order_preview_available": bool(dry_run and orders_previewed_count > 0),
144+
}
145+
146+
122147
signal_text = build_signal_text(t)
123148
strategy_display_name = build_strategy_display_name(t)(
124149
STRATEGY_PROFILE,
@@ -431,6 +456,10 @@ def run_strategy(*, force_run: bool = False, validation_only: bool = False, vali
431456
if cycle_result is not None:
432457
execution = dict(getattr(cycle_result, "execution", {}) or {})
433458
signal_snapshot = dict(execution.get("signal_snapshot") or {})
459+
execution_summary = _summarize_cycle_result_for_report(
460+
cycle_result,
461+
dry_run=bool(report.get("dry_run")),
462+
)
434463
if signal_snapshot:
435464
reporting_adapters.log_event(
436465
log_context,
@@ -441,6 +470,7 @@ def run_strategy(*, force_run: bool = False, validation_only: bool = False, vali
441470
finalize_runtime_report(
442471
report,
443472
status="ok",
473+
summary=execution_summary,
444474
diagnostics={"signal_snapshot": signal_snapshot} if signal_snapshot else None,
445475
)
446476
reporting_adapters.log_event(

tests/test_request_handling.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,24 @@ def test_run_strategy_persists_machine_readable_report(self):
575575
self.assertTrue(report["summary"]["signal_date"])
576576
self.assertTrue(report["summary"]["effective_date"])
577577

578+
def test_cycle_result_summary_counts_dry_run_order_previews(self):
579+
module = load_module()
580+
cycle_result = types.SimpleNamespace(
581+
logs=("dry-run sell", "dry-run buy"),
582+
skip_logs=("skip",),
583+
note_logs=("note",),
584+
action_done=True,
585+
)
586+
587+
summary = module._summarize_cycle_result_for_report(cycle_result, dry_run=True)
588+
589+
self.assertTrue(summary["action_done"])
590+
self.assertEqual(summary["order_events_count"], 2)
591+
self.assertEqual(summary["orders_previewed_count"], 2)
592+
self.assertEqual(summary["orders_skipped_count"], 1)
593+
self.assertEqual(summary["notes_count"], 1)
594+
self.assertTrue(summary["dry_run_order_preview_available"])
595+
578596

579597
if __name__ == "__main__":
580598
unittest.main()

0 commit comments

Comments
 (0)