From 134c00fc7f5252b155fb7bafec8dd977ab85a5f3 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Mon, 17 Aug 2026 09:06:27 +0800 Subject: [PATCH] =?UTF-8?q?fix(compat):=20=E8=A1=A5=E9=BD=90=E5=88=AE?= =?UTF-8?q?=E5=89=8A=E4=B8=8E=E8=A7=84=E5=88=99=E6=8B=86=E5=88=86=E5=90=8E?= =?UTF-8?q?=E7=9A=84=E6=97=A7=E8=B7=AF=E5=BE=84=E6=98=A0=E5=B0=84=EF=BC=8C?= =?UTF-8?q?=E4=BF=9D=E6=8C=81=E6=8F=92=E4=BB=B6=E5=AF=BC=E5=85=A5=E5=8F=AF?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - app.chain.media 登记 ScrapingChain/ScrapingOption/ScrapingConfig 符号叠加, 刮削能力拆出 ScrapingChain 后旧模块路径仍可惰性解析 - app.application.filter/filter_rules 映射到收敛后的 app.application.rules - 补充旧路径模块身份与符号解析测试 --- app/runtime/compat/manifest.py | 24 ++++++++++++++++++++++++ tests/test_legacy_import_compat.py | 28 +++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/app/runtime/compat/manifest.py b/app/runtime/compat/manifest.py index bd565c160..e33ec7ffd 100644 --- a/app/runtime/compat/manifest.py +++ b/app/runtime/compat/manifest.py @@ -42,6 +42,20 @@ MODULE_ALIASES: Dict[str, ModuleAlias] = { introduced="v3.0.0", owner="sdk", ), + # 规则域收敛为单一事实来源 app/application/rules.py: + # filter_rules.py(内置规则集 + RuleParser)更名而来,filter.py(RuleHelper)并入 + "app.application.filter": ModuleAlias( + target="app.application.rules", + replacement="app.application.rules", + introduced="v3.0.0", + owner="application", + ), + "app.application.filter_rules": ModuleAlias( + target="app.application.rules", + replacement="app.application.rules", + introduced="v3.0.0", + owner="application", + ), "app.db.agentchat_oper": ModuleAlias( target="app.db.oper.agentchat", replacement="app.db.oper.agentchat", @@ -748,6 +762,16 @@ SYMBOL_ALIASES: Dict[str, Dict[str, SymbolAlias]] = { replacement="app.schemas.agent.ReplyMode", ), }, + # 刮削能力从 MediaChain 拆出为独立 ScrapingChain 后, + # 原 app.chain.media 模块级公开的刮削选项与策略配置随迁到 app.chain.scraping + "app.chain.media": { + name: SymbolAlias( + target_module="app.chain.scraping", + target_name=name, + replacement=f"app.chain.scraping.{name}", + ) + for name in ("ScrapingChain", "ScrapingOption", "ScrapingConfig") + }, "app.chain.message": { "MediaInteractionChain": SymbolAlias( target_module="app.chain.interaction", diff --git a/tests/test_legacy_import_compat.py b/tests/test_legacy_import_compat.py index f9b493225..0dd4d8932 100644 --- a/tests/test_legacy_import_compat.py +++ b/tests/test_legacy_import_compat.py @@ -280,6 +280,27 @@ def test_physical_modules_resolve_moved_symbols_without_reverse_imports(): assert schemas_package.TransferQueue is legacy_transfer.TransferQueue +def test_chain_media_legacy_scraping_symbols_resolve_to_scraping_chain(): + """刮削拆分后,旧 app.chain.media 路径应能继续取用刮削公开符号。""" + legacy_media = importlib.import_module("app.chain.media") + canonical_scraping = importlib.import_module("app.chain.scraping") + + assert legacy_media.ScrapingChain is canonical_scraping.ScrapingChain + assert legacy_media.ScrapingOption is canonical_scraping.ScrapingOption + assert legacy_media.ScrapingConfig is canonical_scraping.ScrapingConfig + + +def test_rules_domain_legacy_modules_resolve_to_rules(): + """规则域收敛后,filter/filter_rules 旧路径应复用 rules 模块。""" + canonical = importlib.import_module("app.application.rules") + + for legacy_name in ("app.application.filter", "app.application.filter_rules"): + legacy = importlib.import_module(legacy_name) + assert legacy is canonical, legacy_name + assert legacy.RuleHelper is canonical.RuleHelper + assert legacy.RuleParser is canonical.RuleParser + + def test_debug_diagnostics_reports_moved_symbol_path(): """DEBUG 模式应对物理模块中的旧符号路径给出一次迁移提示。""" messages = [] @@ -317,7 +338,7 @@ def test_plugin_scan_reports_moved_symbol_import(tmp_path: Path): def test_symbol_alias_manifest_covers_all_moved_public_symbols(): - """符号级映射清单应覆盖媒体身份、整理工作项与消息/通知命名统一的旧入口。""" + """符号级映射清单应覆盖媒体身份、整理工作项、刮削拆分与消息/通知命名统一的旧入口。""" assert set(SYMBOL_ALIASES["app.domain.media"]) == { "MEDIA_SOURCE_ALIASES", "MEDIA_SOURCE_PREFIXES", @@ -327,6 +348,11 @@ def test_symbol_alias_manifest_covers_all_moved_public_symbols(): "normalize_media_identity_payload", "build_media_key", } + assert set(SYMBOL_ALIASES["app.chain.media"]) == { + "ScrapingChain", + "ScrapingOption", + "ScrapingConfig", + } assert set(SYMBOL_ALIASES["app.schemas"]) == { "TransferTask", "TransferQueue",