refactor(test): 第108波 - ai_parsing纯逻辑模块抽离 + 44单测 #986

Closed
xiaoxia wants to merge 1 commits from test/wave108-ai-parsing into develop
Owner

变更内容

  • 从 ai_service.py 抽离 4 个解析/降级函数到 packages/domain/ai_parsing.py
    • parse_titles_from_response(标题多格式解析)
    • parse_semantic_match_response(语义匹配结果解析)
    • generate_titles_fallback(标题降级生成)
    • keyword_match_fallback(关键词匹配降级)
  • ai_service 保留薄包装函数,完全向后兼容
  • 新增 44 个纯逻辑单测
  • ai_service.py: 536→351行 (-185行, -35%)

验证

  • 原有 test_ai_service (41个) + test_ai_parsing (44个) = 85 passed
## 变更内容 - 从 ai_service.py 抽离 4 个解析/降级函数到 packages/domain/ai_parsing.py - parse_titles_from_response(标题多格式解析) - parse_semantic_match_response(语义匹配结果解析) - generate_titles_fallback(标题降级生成) - keyword_match_fallback(关键词匹配降级) - ai_service 保留薄包装函数,完全向后兼容 - 新增 44 个纯逻辑单测 - ai_service.py: 536→351行 (-185行, -35%) ## 验证 - 原有 test_ai_service (41个) + test_ai_parsing (44个) = 85 passed
xiaoxia added 1 commit 2026-07-27 00:27:42 +08:00
refactor(wave108): 抽离ai_parsing纯逻辑模块 + 44单测
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 55s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m13s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 51s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 1m52s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m10s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 25s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m13s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 41s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 40s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
AI Code Review / AI Code Review (pull_request) Successful in 4m7s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m1s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 5m20s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 2m43s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m19s
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
ACR Cleanup / ACR Image Cleanup (pull_request_target) Has been cancelled
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 34s
6b8c07de16
- 从ai_service.py抽离4个解析/降级函数到packages/domain/ai_parsing.py
- ai_service保留薄包装函数,完全向后兼容
- 新增44个纯逻辑单测,覆盖标题解析、语义匹配解析、标题降级、关键词匹配
- ai_service.py: 536→351行 (-185行, -35%)

🚀 预览环境已部署

项目 详情
PR号 #986
预览链接 https://pr-986.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #986 | | 预览链接 | [https://pr-986.preview.xiaoxiajianji.com](https://pr-986.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
Collaborator

代码审查结果 - PR #986

📊 审查概览

  • 整体评价:通过
  • 严重问题数量:0 个
  • 一般建议数量:1 个

需修改的问题(严重)

💡 改进建议(一般)

  1. apps/api/app/services/ai_service.py 第189行:不必要的字典拷贝操作
    • 具体内容return dict(result) 这一行对解析结果进行了浅拷贝。由于 _parse_semantic_match_base 已经返回了一个新构造的字典,且该字典后续若无特殊不可变需求,此处再次创建副本属于多余的性能开销(虽然对于小字典影响微乎其微)。
    • 修改建议:直接返回 result 即可,即 return result

良好实践

  1. 重构解耦:将纯逻辑解析函数从 ai_service.py 剥离到 packages/domain/ai_parsing.py,符合领域驱动设计(DDD)思想,提升了代码的可测试性和复用性。
  2. 副作用控制:在 keyword_match_fallback 函数中,使用 new_asset = dict(asset) 创建副本而非直接修改传入的 asset 字典,避免了副作用,是良好的函数式编程实践。
  3. 测试覆盖:新增的单元测试 test_ai_parsing.py 覆盖了多种边界情况(如空值、格式异常、Markdown代码块等),保证了重构逻辑的正确性。
  4. 类型提示:新代码使用了 list[str] 等现代 Python 类型提示,代码可读性更好。
  5. 防御性编程:在 generate_titles_fallback 中对 examples 列表使用了 .get("examples", []) 并做了判空处理,防止了 IndexError

格式检查通过 | 逻辑审查通过 | 性能良好


🤖 由 AI 代码审查机器人自动生成 | 2026-07-26 16:34:36 | 模型:

## 代码审查结果 - PR #986 ### 📊 审查概览 - 整体评价:通过 - 严重问题数量:0 个 - 一般建议数量:1 个 ### ❌ 需修改的问题(严重) 无 ### 💡 改进建议(一般) 1. **apps/api/app/services/ai_service.py 第189行**:不必要的字典拷贝操作 - **具体内容**:`return dict(result)` 这一行对解析结果进行了浅拷贝。由于 `_parse_semantic_match_base` 已经返回了一个新构造的字典,且该字典后续若无特殊不可变需求,此处再次创建副本属于多余的性能开销(虽然对于小字典影响微乎其微)。 - **修改建议**:直接返回 `result` 即可,即 `return result`。 ### ✅ 良好实践 1. **重构解耦**:将纯逻辑解析函数从 `ai_service.py` 剥离到 `packages/domain/ai_parsing.py`,符合领域驱动设计(DDD)思想,提升了代码的可测试性和复用性。 2. **副作用控制**:在 `keyword_match_fallback` 函数中,使用 `new_asset = dict(asset)` 创建副本而非直接修改传入的 `asset` 字典,避免了副作用,是良好的函数式编程实践。 3. **测试覆盖**:新增的单元测试 `test_ai_parsing.py` 覆盖了多种边界情况(如空值、格式异常、Markdown代码块等),保证了重构逻辑的正确性。 4. **类型提示**:新代码使用了 `list[str]` 等现代 Python 类型提示,代码可读性更好。 5. **防御性编程**:在 `generate_titles_fallback` 中对 `examples` 列表使用了 `.get("examples", [])` 并做了判空处理,防止了 `IndexError`。 --- ✅ 格式检查通过 | ✅ 逻辑审查通过 | ✅ 性能良好 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-26 16:34:36 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia closed this pull request 2026-07-27 15:26:16 +08:00

🗑️ 预览环境已清理

PR #986 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #986 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Some checks are pending
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 55s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m13s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 51s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 1m52s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m10s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 25s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 2m13s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 41s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 40s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
AI Code Review / AI Code Review (pull_request) Successful in 4m7s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 4m1s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 5m20s
CI/CD Pipeline / Unit Tests (pull_request) Failing after 2m43s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m19s
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
ACR Cleanup / ACR Image Cleanup (pull_request_target) Has been cancelled
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 34s

Pull request closed

Sign in to join this conversation.