Skip to content

refactor(mobile): damai_app.py 拆分为包(零行为变更) - #44

Merged
currycan merged 1 commit into
masterfrom
refactor/damai-app-split
May 6, 2026
Merged

refactor(mobile): damai_app.py 拆分为包(零行为变更)#44
currycan merged 1 commit into
masterfrom
refactor/damai-app-split

Conversation

@currycan

@currycan currycan commented May 6, 2026

Copy link
Copy Markdown
Owner

Summary

  • mobile/damai_app.py(2072 行)→ mobile/damai_app/ 包,共 9 个文件(含 __main__.py
  • 零行为变更:仅搬代码、不改逻辑、不重命名、不改默认值、不删 helper
  • 测试零修改:现有 tests/unit/test_mobile_damai_app.py / _u2_adapter.py / test_environment_check.py 跑绿
  • 外部 API 兼容:from mobile.damai_app import DamaiBot 等所有原导入路径不变

拆分结构

文件 行数 职责
__init__.py 215 包入口;模块级常量 / 重新导出 / _DamaiPackage 镜像 hook
__main__.py 28 python -m damai_app 入口(替代原 python damai_app.py
orchestrator.py 1075 DamaiBot 主类 + run_ticket_grabbing (~390 行) + run_with_retry
sale_waiter.py 144 wait_for_sale_start + _is_sale_ready + _purchase_bar_text_ready
purchase_flow.py 169 _enter_purchase_flow_from_detail_page + _submit_order_fast
recovery_strategies.py 187 back-press 恢复 + _fast_retry_from_current_state 状态机
coords_cache.py 39 热路径坐标缓存读取
state_probe.py 295 页面状态探测 + SKU 检视 + 标题/场地解析
delegators.py 247 AttendeeSelector / PriceSelector / EventNavigator / FastPipeline 薄封装

orchestrator.py 仍超 500 行限制,主因 run_ticket_grabbing 单方法 ~390 行。本次重构规约「不动逻辑」,方法体内拆分留到后续 PR。

测试兼容关键点:模块属性镜像 hook

测试代码大量使用 patch("mobile.damai_app.time") / patch("mobile.damai_app.datetime") / patch("mobile.damai_app.logger") 替换整模块/类对象。
拆分后子模块的 import time 引用是子模块本地的,原 patch 不会再生效。

__init__.py 中定义 _DamaiPackage(types.ModuleType),重写 __setattr__
time / datetime / logger / re 这几个白名单属性,写入会同步镜像到所有子模块的 sys.modules 条目。这样测试 patch 包级属性时,子模块代码看到的也是 mock,零测试改动即可跑绿。

启动脚本变更

mobile/scripts/start_ticket_grabbing.sh 第 298/300 行:

  • 旧:python damai_app.py
  • 新:python -m damai_app

mobile/damai_app/__main__.py 复刻原 if __name__ == \"__main__\": 逻辑(构造 DamaiBotrun_with_retry(max_retries=3)、finally 关 driver)。

Test plan

  • poetry run pytest:1020 passed, 1 xfail(预存,与 page_probe.py unknown_threshold=0 语义无关)
  • poetry run pytest --cov=mobile --cov-fail-under=80:覆盖率 81.03% ≥ 80%
  • from mobile.damai_app import DamaiBot, logger, SALE_READY_TEXTS, Config 均成功
  • python -m damai_app(cwd=mobile/)能找到包并 import
  • mobile/hot_path_benchmark.py --help 正常打印(from mobile.damai_app import DamaiBot 可达)
  • 真机 benchmark:本 PR 未在真机跑(CI 环境无设备);建议合并前在测试机执行 bash mobile/scripts/benchmark_hot_path.sh --runs 3 比对 before/after,确认热路径耗时无回退

Why

mobile/damai_app.py 单文件 2072 行已远超风格阈值,DamaiBot 类近 100 个方法,维护成本上升、合并冲突频繁。拆分后每个子模块聚焦单一职责,便于后续按模块迭代修复(issue #25/#28/#23/#24 后续若再触及 hot path 都能定位到合适子模块)。

不在本 PR 范围

  • run_ticket_grabbing 内部拆分(建议 W4 后做,需要先补 hot-path 真机回归证据)
  • 任何逻辑/性能优化
  • 命名整治(如 _submit_order_fastsubmit_order_fast
  • 删除可疑 helper(保留以稳过渡)

关联

  • 关联 reference/03-tech-assessment.md 「damai_app.py 拆分建议」
  • 不关闭任何 issue(纯重构)

🤖 Generated with Claude Code

把单文件 mobile/damai_app.py(2072 行)拆分为 mobile/damai_app/ 包:
- __init__.py        包入口;保留所有原模块级符号 + 自定义 ModuleType
                     hook 把 patch("mobile.damai_app.{time,datetime,logger}")
                     镜像到所有子模块,使测试零修改
- __main__.py        支持 python -m damai_app(替代原 python damai_app.py)
- orchestrator.py    DamaiBot 主类 + run_ticket_grabbing + run_with_retry
                     + 启动/弹窗/会话探测/票价确认等编排
- sale_waiter.py     wait_for_sale_start + 自适应轮询
- purchase_flow.py   _enter_purchase_flow_from_detail_page + _submit_order_fast
- recovery_strategies.py 状态机 dispatcher + back-press 恢复
- coords_cache.py    热路径坐标缓存命中检查与坐标读取
- state_probe.py     页面状态探测 + SKU 检视 + 标题/场地解析
- delegators.py      AttendeeSelector / PriceSelector / EventNavigator /
                     FastPipeline 的薄封装

零行为变更:
- 仅搬代码,不动逻辑、不改默认值、不重命名(_submit_order_fast 等保持下划线)
- 外部 API 不变:from mobile.damai_app import DamaiBot 仍兼容;
  Config / logger / time / datetime 等模块属性仍可被测试 patch
- 测试零修改:1020 通过 + 1 预存 xfail,覆盖率 81.03%(≥80% 门槛)

启动脚本同步:
- mobile/scripts/start_ticket_grabbing.sh:python damai_app.py → python -m damai_app
@currycan
currycan merged commit c28e089 into master May 6, 2026
5 checks passed
@currycan
currycan deleted the refactor/damai-app-split branch July 11, 2026 07:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant