diff --git a/scripts/data_platform/corpus_download.py b/scripts/data_platform/corpus_download.py index e4995c9..2b74691 100644 --- a/scripts/data_platform/corpus_download.py +++ b/scripts/data_platform/corpus_download.py @@ -727,6 +727,8 @@ def _run_fulltext(ctx, cl_em, ledgers, recents, new_articles): ctx.reset_stage() seen = set() for art_code, url, show_time in new_articles: + if ctx.budget_exhausted(): + break if art_code in seen or is_done(ctx.lane, "fulltext", art_code): continue try: diff --git a/tests/data_platform/test_corpus_download.py b/tests/data_platform/test_corpus_download.py index f913069..b79801c 100644 --- a/tests/data_platform/test_corpus_download.py +++ b/tests/data_platform/test_corpus_download.py @@ -477,6 +477,17 @@ def test_daily_limit_is_per_stage_and_bounds_pdf_fivecat(root, monkeypatch): assert news_calls == 1 # news 段独立预算未被 ann 挤占 +def test_daily_limit_bounds_fulltext_stage(root, monkeypatch): + """回归(三跑冒烟超时): fulltext 段漏预算门——new_articles 去重后仍可 + 远超 N(2 股×100 条 → ~150 art),冒烟变 7 分钟马拉松。""" + two_arts = [{"code": f"art{i}", "date": "2026-09-06 10:00:00", + "title": f"t{i}", "content": "c", "mediaName": "m", "image": ""} + for i in (1, 2)] + _wire_daily(monkeypatch, root, news_rows=two_arts) + cd.run_lane("daily", limit=2) + assert cd.fetch_article_html.call_count == 2 # 预算 2,非 4(2股×2art) + + def test_daily_express_title_routes_to_pdf(root, monkeypatch): """标题含「业绩快报」→ 进当日 PDF 待下清单(无服务端码,客户端谓词)。""" todo = cd.collect_pdf_candidates(