refactor(test): 第107波 - subtitle_style领域模型抽离 + 76单测 #985

Closed
xiaoxia wants to merge 1 commits from test/wave107-subtitle-style into develop
Owner

变更内容

  • 从 subtitle_render_engine.py 抽离 SubtitleStyle/SubtitleSegment/常量/ASS工具函数
  • subtitle_render_engine 保留全部导出,完全向后兼容
  • 新增 76 个纯逻辑单测,覆盖颜色转换、时间格式化、文本换行、样式解析
  • subtitle_render_engine.py: 685→454行 (-231行, -34%)

验证

  • 原有 test_subtitle_render_engine (54个) + test_subtitle_style (76个) = 130 passed
## 变更内容 - 从 subtitle_render_engine.py 抽离 SubtitleStyle/SubtitleSegment/常量/ASS工具函数 - subtitle_render_engine 保留全部导出,完全向后兼容 - 新增 76 个纯逻辑单测,覆盖颜色转换、时间格式化、文本换行、样式解析 - subtitle_render_engine.py: 685→454行 (-231行, -34%) ## 验证 - 原有 test_subtitle_render_engine (54个) + test_subtitle_style (76个) = 130 passed
xiaoxia added 1 commit 2026-07-26 22:47:06 +08:00
refactor(wave107): 抽离subtitle_style领域模型 + 76单测
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 7s
CI/CD Pipeline / Validate - Code Quality (pull_request) Failing after 1m19s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 47s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 50s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 29s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m23s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 7s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 7s
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
AI Code Review / AI Code Review (pull_request) Successful in 3m36s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 38s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m46s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 38s
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 / 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 / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m8s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 2m44s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Has been cancelled
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 31s
3d9a337d2a
- 从subtitle_render_engine.py抽离SubtitleStyle/SubtitleSegment/常量/ASS工具函数
- subtitle_render_engine保留全部导出,完全向后兼容
- 新增76个纯逻辑单测,覆盖颜色转换、时间格式化、文本换行、样式解析
- subtitle_render_engine.py: 685→454行 (-231行, -34%)
Collaborator

代码审查结果 - PR #985

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

  1. packages/domain/subtitle_style.py 第46行、第56行hex_to_ass_colorhex_to_ass_bgr 函数存在类型安全隐患,未对输入参数进行非空和类型检查。
    • 问题描述:当前代码直接调用 hex_color.lstrip("#")。如果传入的 hex_colorNone 或非字符串类型(如 int),将抛出 AttributeError。虽然 SubtitleStyle 内部使用 safe_str 保证了属性不为 None,但这些函数作为公共 API 导出,可能被外部模块直接调用,缺乏防御性编程。
    • 修改建议:在函数开头增加类型检查,例如 if not isinstance(hex_color, str): return "&H00FFFFFF"

💡 建议(2个可选)

  1. packages/domain/subtitle_style.py 第80行format_ass_time 函数的小时格式化可能存在兼容性隐患。
    • 具体内容:当前格式 f"{hours:...}" 未限制小时位数。如果时长超过 99 小时(如 100:00:00.00),生成的 ASS 时间码可能不符合部分严格解析器的 h:mm:ss.cs 标准预期。建议根据业务场景确认是否需要限制小时数或取模。
  2. packages/domain/subtitle_style.py 第97行wrap_text 函数在 max_chars 较大时存在性能隐患。
    • 具体内容:for i in range(max_chars, max_chars // 2, -1) 循环次数与 max_chars 成正比。虽然字幕通常较短,但如果 max_chars 被意外设置得很大(如 10000),会导致单次换行计算耗时过长。建议限制最大搜索范围或优化查找算法。

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


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

## 代码审查结果 - PR #985 ### ⚠️ 问题(1个需要修改) 1. **packages/domain/subtitle_style.py 第46行、第56行**:`hex_to_ass_color` 和 `hex_to_ass_bgr` 函数存在类型安全隐患,未对输入参数进行非空和类型检查。 - 问题描述:当前代码直接调用 `hex_color.lstrip("#")`。如果传入的 `hex_color` 为 `None` 或非字符串类型(如 `int`),将抛出 `AttributeError`。虽然 `SubtitleStyle` 内部使用 `safe_str` 保证了属性不为 None,但这些函数作为公共 API 导出,可能被外部模块直接调用,缺乏防御性编程。 - 修改建议:在函数开头增加类型检查,例如 `if not isinstance(hex_color, str): return "&H00FFFFFF"`。 ### 💡 建议(2个可选) 1. **packages/domain/subtitle_style.py 第80行**:`format_ass_time` 函数的小时格式化可能存在兼容性隐患。 - 具体内容:当前格式 `f"{hours:...}"` 未限制小时位数。如果时长超过 99 小时(如 100:00:00.00),生成的 ASS 时间码可能不符合部分严格解析器的 `h:mm:ss.cs` 标准预期。建议根据业务场景确认是否需要限制小时数或取模。 2. **packages/domain/subtitle_style.py 第97行**:`wrap_text` 函数在 `max_chars` 较大时存在性能隐患。 - 具体内容:`for i in range(max_chars, max_chars // 2, -1)` 循环次数与 `max_chars` 成正比。虽然字幕通常较短,但如果 `max_chars` 被意外设置得很大(如 10000),会导致单次换行计算耗时过长。建议限制最大搜索范围或优化查找算法。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能建议关注 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-07-26 15:17:41 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->

🚀 预览环境已部署

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

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

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

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

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

🗑️ 预览环境已清理

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

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

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

Pull request closed

Sign in to join this conversation.