diff --git a/scripts/data_platform/bs_5m_eod.py b/scripts/data_platform/bs_5m_eod.py index fc45302..b7ce8e7 100644 --- a/scripts/data_platform/bs_5m_eod.py +++ b/scripts/data_platform/bs_5m_eod.py @@ -283,8 +283,10 @@ def _run(args): log.info("[CHUNK] %s~%s ok=%d empty=%d failed=%d rows=%d", chunk[0], chunk[1], cs["ok"], cs["empty"], cs["failed"], cs["db_rows"]) - if not lr and swept[0] < DAILY_LIMIT: - # 整片扫完才推进 state; 没扫完次日重拉同片(OR REPLACE 幂等续跑) + if not lr and swept[0] < DAILY_LIMIT and not args.limit: + # 整片扫完才推进 state; 没扫完次日重拉同片(OR REPLACE 幂等续跑); + # --limit 冒烟只拉 N 只 ≠ 整片完成, 同禁推进(2026-08-22 冒烟 + # 实锤多推一片跳过半年窗口) save_chunk_state({"next_end": chunk[0]}) # 每日增量照跑(回灌期也跑, 近端 7 天始终新鲜) istats, lr = _sweep(conn, stocks, inc_start, inc_end, swept, "inc") diff --git a/tests/data_platform/test_bs_5m_eod.py b/tests/data_platform/test_bs_5m_eod.py index 20f25a3..9190f49 100644 --- a/tests/data_platform/test_bs_5m_eod.py +++ b/tests/data_platform/test_bs_5m_eod.py @@ -218,6 +218,22 @@ def test_main_runs_and_exits_0(main_env): assert not (main_env / "bs_5m.lock").exists() +def test_main_limit_smoke_never_advances_state(main_env, monkeypatch): + """--limit 冒烟只拉 N 只 ≠ 整片完成: 绝不推进 chunk state。 + + 2026-08-22 09:17 独立容器冒烟(--limit 3)实锤把 state 多推一片 + ([2025-02-18,2025-08-20] 半年片被 3 只股"代表"5548 只跳过): 根因 + limit_reached 只盯 DAILY_LIMIT 配额防线, --limit 预截断后循环"正常 + 跑完" lr=False, 推进守卫畅通。""" + monkeypatch.setattr(sys, "argv", ["bs_5m_eod.py", "--limit", "1"]) + with patch.object(b5, "_process_one", return_value=48) as m_proc: + with pytest.raises(SystemExit) as e: + b5.main() + assert e.value.code == 0 + assert m_proc.call_count == 2 # 1 股 × (chunk+inc) + assert not (main_env / "bs_5m_state.json").exists() # 冒烟不落 state + + def test_main_increment_only_when_backfill_done(main_env, monkeypatch): """回灌完结盖章(next_end=None) → 只跑每日增量(单 sweep)。""" b5.save_chunk_state({"next_end": None})