refactor(wave112): 抽离intro_outro_config领域模型 + 52单测 #998

Closed
xiaoxia wants to merge 1 commits from test/wave112-intro-outro-config into develop
Owner

变更内容

  • 新建 packages/domain/intro_outro_config.py:纯逻辑领域模型

    • IntroOutroConfig 数据类(20+字段)
    • from_dict 类方法(带安全类型转换+容错回退)
    • has_intro / has_outro / total_extra_duration 属性
    • validate 校验方法(类型/路径/时长/字号全覆盖)
    • 类型常量 + 转场常量
  • 精简 apps/worker/video_processing/intro_outro_engine.py

    • 416→309行(-107行,-26%)
    • 数据类/常量全部委托给 intro_outro_config
    • 保留模块级导出,完全向后兼容
  • 新增 52 个单测(test_intro_outro_config.py)

    • 默认值(3 个)
    • from_dict 各种输入(19 个)
    • has_intro/has_outro(8 个)
    • total_extra_duration(5 个)
    • validate 全场景(17 个)

验证

  • 本地全绿:133 passed(81 intro_outro_engine 原有 + 52 新增)
  • black 格式化通过

关联

后端单测覆盖率提升 wave112,intro_outro_engine 大文件拆分第一波。

## 变更内容 - **新建** `packages/domain/intro_outro_config.py`:纯逻辑领域模型 - `IntroOutroConfig` 数据类(20+字段) - `from_dict` 类方法(带安全类型转换+容错回退) - `has_intro` / `has_outro` / `total_extra_duration` 属性 - `validate` 校验方法(类型/路径/时长/字号全覆盖) - 类型常量 + 转场常量 - **精简** `apps/worker/video_processing/intro_outro_engine.py` - 416→309行(-107行,-26%) - 数据类/常量全部委托给 intro_outro_config - 保留模块级导出,**完全向后兼容** - **新增** 52 个单测(test_intro_outro_config.py) - 默认值(3 个) - from_dict 各种输入(19 个) - has_intro/has_outro(8 个) - total_extra_duration(5 个) - validate 全场景(17 个) ## 验证 - 本地全绿:133 passed(81 intro_outro_engine 原有 + 52 新增) - black 格式化通过 ## 关联 后端单测覆盖率提升 wave112,intro_outro_engine 大文件拆分第一波。
xiaoxia added 1 commit 2026-07-27 00:59:50 +08:00
refactor(wave112): 抽离intro_outro_config领域模型 + 52单测
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 20s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m10s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 2m2s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m8s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 53s
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 Web Image (pull_request) Successful in 29s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 35s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 55s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 56s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m53s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m18s
AI Code Review / AI Code Review (pull_request) Successful in 3m34s
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
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m24s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m41s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
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 / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
ACR Cleanup / ACR Image Cleanup (pull_request_target) Has been cancelled
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 26s
601dd1dba9
- 新建 packages/domain/intro_outro_config.py:IntroOutroConfig 数据类
  + from_dict / has_intro / has_outro / validate / total_extra_duration
  + 4种片头片尾类型常量 + 3种转场常量
- intro_outro_engine.py: 416→309行 (-107行, -26%)
  保留模块级导出,完全向后兼容
- 新增 52 个单测覆盖数据模型 + 纯逻辑函数

🚀 预览环境已部署

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

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

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

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

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

代码审查结果 - PR #998

⚠️ 问题(0个需要修改)

💡 建议(1个可选)

  1. packages/domain/intro_outro_config.py 第113行video_path 的解析逻辑使用了 or "",虽然对于路径字符串通常安全,但如果路径名为 "0" 等假值会被意外清空。建议改为显式判断 None 或空字符串,不过考虑到文件名极少为 "0",当前写法可接受。

格式检查通过 | 逻辑审查需修改 | 建议关注性能

审查详情

📊 审查概览

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

需修改的问题(严重)

💡 改进建议(一般)

  1. [packages/domain/intro_outro_config.py: 113-114] 路径解析的假值处理
    • 具体内容:代码中 intro.get("video_path", intro.get("video", "")) or "" 利用了 Python 的假值逻辑。如果数据库或配置中极端情况下存储了字符串 "0" 作为路径,它会被转换为空字符串。虽然这种情况极为罕见,但显式检查 if val is None or val == "": ... 会更加严谨。鉴于当前场景风险极低,此为可选建议。

良好实践

  1. 重构解耦:成功将 IntroOutroConfigintro_outro_engine.py 中剥离到 packages/domain,符合领域驱动设计(DDD)思想,提升了代码的可维护性和可测试性。
  2. 异常处理增强:在 from_dict 方法中新增了 try-except 块来处理数值转换(如 float, int),有效防止了因配置数据类型错误导致的程序崩溃,比旧代码更加健壮。
  3. 向后兼容:在 intro_outro_engine.py 中保留了常量的导入并标记 noqa: F401,确保了外部引用该模块常量的旧代码不会报错,重构风控良好。
  4. 测试覆盖:新增的单元测试文件非常详尽,覆盖了默认值、字典解析、边界条件(如 None、空字符串、非法数值)以及验证逻辑,质量很高。
  5. 常量定义:使用常量(如 INTRO_OUTRO_TYPE_VIDEO)替代魔术字符串,提升了代码可读性。

🤖 由 AI 代码审查机器人自动生成 | 2026-07-26 17:54:14 | 模型:

## 代码审查结果 - PR #998 ### ⚠️ 问题(0个需要修改) 无 ### 💡 建议(1个可选) 1. **packages/domain/intro_outro_config.py 第113行**:`video_path` 的解析逻辑使用了 `or ""`,虽然对于路径字符串通常安全,但如果路径名为 `"0"` 等假值会被意外清空。建议改为显式判断 `None` 或空字符串,不过考虑到文件名极少为 `"0"`,当前写法可接受。 --- ✅ 格式检查通过 | ✅ 逻辑审查需修改 | ✅ 建议关注性能 ## 审查详情 ### 📊 审查概览 - **整体评价**:通过 - **严重问题数量**:0 个 - **一般建议数量**:1 个 ### ❌ 需修改的问题(严重) 无 ### 💡 改进建议(一般) 1. **[packages/domain/intro_outro_config.py: 113-114] 路径解析的假值处理** - **具体内容**:代码中 `intro.get("video_path", intro.get("video", "")) or ""` 利用了 Python 的假值逻辑。如果数据库或配置中极端情况下存储了字符串 `"0"` 作为路径,它会被转换为空字符串。虽然这种情况极为罕见,但显式检查 `if val is None or val == "": ...` 会更加严谨。鉴于当前场景风险极低,此为可选建议。 ### ✅ 良好实践 1. **重构解耦**:成功将 `IntroOutroConfig` 从 `intro_outro_engine.py` 中剥离到 `packages/domain`,符合领域驱动设计(DDD)思想,提升了代码的可维护性和可测试性。 2. **异常处理增强**:在 `from_dict` 方法中新增了 `try-except` 块来处理数值转换(如 `float`, `int`),有效防止了因配置数据类型错误导致的程序崩溃,比旧代码更加健壮。 3. **向后兼容**:在 `intro_outro_engine.py` 中保留了常量的导入并标记 `noqa: F401`,确保了外部引用该模块常量的旧代码不会报错,重构风控良好。 4. **测试覆盖**:新增的单元测试文件非常详尽,覆盖了默认值、字典解析、边界条件(如 None、空字符串、非法数值)以及验证逻辑,质量很高。 5. **常量定义**:使用常量(如 `INTRO_OUTRO_TYPE_VIDEO`)替代魔术字符串,提升了代码可读性。 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-26 17:54:14 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia closed this pull request 2026-07-27 15:26:21 +08:00

🗑️ 预览环境已清理

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

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

🗑️ **预览环境已清理** PR #998 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Some checks are pending
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 20s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m10s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 2m2s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m8s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 53s
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 Web Image (pull_request) Successful in 29s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 35s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 55s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 56s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 2m53s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m18s
AI Code Review / AI Code Review (pull_request) Successful in 3m34s
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
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Successful in 3m24s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m41s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
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 / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
ACR Cleanup / ACR Image Cleanup (pull_request_target) Has been cancelled
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 26s

Pull request closed

Sign in to join this conversation.