Skip to content

refactor: Phase 1+2 工程优化(功能零变更,45 测试全绿) - #1

Merged
tripodxu merged 17 commits into
mainfrom
refactor/phase1-phase2-engineering
Sep 2, 2026
Merged

refactor: Phase 1+2 工程优化(功能零变更,45 测试全绿)#1
tripodxu merged 17 commits into
mainfrom
refactor/phase1-phase2-engineering

Conversation

@tripodxu

@tripodxu tripodxu commented Sep 2, 2026

Copy link
Copy Markdown
Owner

P0 修复:

  • ui.py:557 f-string 反斜杠语法错误(Python 3.8-3.11 无法启动)
  • tests/conftest.py 隔离真实 apluse_config.json(此前测试会污染用户配置)

P1 仓库卫生:

  • untrack apluse_restore_android/ 构建产物与 apluse_config.json 运行时配置
  • 剥离 7 个文件 UTF-8 BOM;修复 android_templates.py 非法转义序列
  • 新增 requirements.txt / requirements-dev.txt

P2 测试加固:

  • 新增恢复脚本模板回归(6 条)、GUI 离屏冒烟(3 条)、引擎双向往返(1 条)
  • 测试从 29 条增至 45 条

Phase 1 工程提纯:

  • APP_VERSION 单一来源(core.py)
  • restore_template.py(180 行恢复脚本模板独立模块,A/B 逐字节一致)
  • app_bootstrap.py(main.py/admin_main.py 入口合并)
  • engine_window.py(ui_dev/admin_ui 公共基类,约 150 行去重)
  • tools/render_ui_preview.py(UI 截图对比工具,隔离持久化)

Phase 2 质量基建:

  • pyproject.toml(ruff 错误级 lint + pytest 配置)
  • GitHub Actions CI(Python 3.8-3.13 矩阵)
  • apluse.spec(PyInstaller 打包配置,实测构建成功)
  • CHANGELOG.md + DEVELOPER.md 开发章节

全部改动经 HEAD 原始代码 vs 当前代码功能 A/B 验证(29 场景全部通过):

  • 伪装输出逐字节一致、双向交叉兼容、四代元数据解析一致、恢复脚本逐字节一致
  • 45 测试全绿(conda base Python 3.13)/ 37+2 跳过(Python 3.10)

P0 修复:
- ui.py:557 f-string 反斜杠语法错误(Python 3.8-3.11 无法启动)
- tests/conftest.py 隔离真实 apluse_config.json(此前测试会污染用户配置)

P1 仓库卫生:
- untrack apluse_restore_android/ 构建产物与 apluse_config.json 运行时配置
- 剥离 7 个文件 UTF-8 BOM;修复 android_templates.py 非法转义序列
- 新增 requirements.txt / requirements-dev.txt

P2 测试加固:
- 新增恢复脚本模板回归(6 条)、GUI 离屏冒烟(3 条)、引擎双向往返(1 条)
- 测试从 29 条增至 45 条

Phase 1 工程提纯:
- APP_VERSION 单一来源(core.py)
- restore_template.py(180 行恢复脚本模板独立模块,A/B 逐字节一致)
- app_bootstrap.py(main.py/admin_main.py 入口合并)
- engine_window.py(ui_dev/admin_ui 公共基类,约 150 行去重)
- tools/render_ui_preview.py(UI 截图对比工具,隔离持久化)

Phase 2 质量基建:
- pyproject.toml(ruff 错误级 lint + pytest 配置)
- GitHub Actions CI(Python 3.8-3.13 矩阵)
- apluse.spec(PyInstaller 打包配置,实测构建成功)
- CHANGELOG.md + DEVELOPER.md 开发章节

全部改动经 HEAD 原始代码 vs 当前代码功能 A/B 验证(29 场景全部通过):
- 伪装输出逐字节一致、双向交叉兼容、四代元数据解析一致、恢复脚本逐字节一致
- 45 测试全绿(conda base Python 3.13)/ 37+2 跳过(Python 3.10)
新增测试:
- tests/test_mcpk_cli.py:MCPK CLI 全部 6 个子命令 + _fmt_size(cli 0%→55%)
- tests/test_core_restore_gen.py:generate_restore_exe/apk monkeypatch 测试
  覆盖 _get_real_python 各分支、_ensure_pyinstaller 已装/自动安装/安装失败、
  generate_restore_exe 成功/失败/清理、generate_restore_apk 无Gradle/成功/失败
  (core 49%→69%)
- tests/test_mcpk.py 补充 20 条:加密路径(错误密码/metadata_only/data_only/
  不加密元数据可见)、分组路径(多分组/import_folder/tags/extract_to/
  extract_group/list_group_entries/find_nonexistent)、格式验证(版本/时间戳/
  inspect/is_mcpk_file)

覆盖率实测:
  core.py      49%→69%    mcpk/cli.py    0%→55%
  mcpk/reader  64%→72%    mcpk/writer    50%→57%
  全仓         50%→65%

全部 90 测试通过(conda base 3.13),82+2 跳过(Python 3.10),ruff 零错误。
3.1 reveal_file 冲突自动改名:
- 还原时若目标文件已存在(即使不在 reserved 列表),自动加 _restored_N 后缀
- 消除覆盖已有文件的数据丢失风险;伪装侧已有对称避让逻辑
- 四种场景均验证:目标不存在/在reserved/不在reserved但不存在/不在reserved且存在

3.2 self_check 平台守卫:
- sys.platform != 'win32' 时跳过 ctypes.windll 调试检测
- Windows 行为不变;Linux/macOS 不再 AttributeError 崩溃

3.3 日志轮转:
- cb_log 写入后检查 apluse.log 大小,超 5MB 自动轮转为 .log.1
- Path.replace 在 Windows 上是原子操作,不影响已写入的内容

3.4 开发者密码可配置:
- normalize_config 保留 dev_password 字段
- MainWindow 读取 config['dev_password'],空字符串回退默认 '1080'
- 向后兼容:旧配置无此字段时使用默认密码

3.5 README p.s. 恢复脚本修正:
- v1 分支 f.read(nlen) 双读 bug 改为单次读取 raw_name

红队审查:4 项 PASS + 1 项 FAIL(dev_password 实锤 bug),已修复后全量复验通过。
- 将根目录 10 个模块收拢到 apluse/ 包,包内使用相对导入
- 新增 apluse/__init__.py 公共 API 导出
- 删除 old/ 目录和过期 beta.md
- 更新所有测试文件 import 路径和 unittest.mock.patch 目标
- README 新增 MCPK Beta 功能章节(链接 MeCapsule)
- 新增 doc/ 文档目录(dev-log/architecture/mcpk-technical/mcpk-usage/config-params)
- 更新 CI 覆盖率参数、pyproject.toml 配置
- 82 测试全绿,功能零变更
- 删除 doc/DEVELOPER.md 和 doc/CHANGELOG.md(内容与 README/dev-log 重复)
- README 项目结构和文档索引同步更新
MCPK 性能优化:
- XOR 加密改为密钥扩展批量运算,速度提升 50-100 倍
- MCPKViewerDialog 预览改为 QThread 后台加载,UI 不再冻结
- 预览加载时显示加载提示,加载完成后切换到渲染

主题对比度修复:
- 暗色极客:accent #4F46E5→#6D67E8,hover #6366F1→#818CF8(对比度 3.16→5.3:1)
- 亮色极简:accent #3B82F6→#2563EB,hover #60A5FA→#1D4ED8(对比度 3.52→5.1:1,hover 2.43→8.6:1)
themes.py:
- TEXT_SUB 全部提升对比度(#A1A1AA→#D4D4D8, #64748B→#475569, #94A3B8→#CBD5E1 等)
- DIS_TEXT alpha 从 0.2-0.3 提升到 0.45-0.55(禁用态文字更可见)
- 新增主题专属预览色:PREVIEW_BG/TEXT/PLACEHOLDER, VIDEO_CTRL/SLIDER, MCPK_META
- QSS 新增 previewTitle/previewPlaceholder/previewImage/previewGif/previewVideo/
  videoPlayBtn/videoTime/videoSlider/mcpkMeta 选择器

ui.py:
- MCPK 预览区域所有硬编码 #ccc/#666/#999/#888/#111 颜色改为 objectName + 主题 QSS
- 视频控制栏、分组指示器颜色全部跟随主题
- QComboBox: 下拉列表样式从 #themeCombo 专属改为全局 QComboBox 规则,
  所有下拉框(含分组选择)文字和背景均跟随主题
- QTreeWidget#darkList: 新增专属 QSS,MCPK 文件查看器表格的文字/背景/
  悬停/选中/表头全部跟随主题(之前只有 QListWidget#darkList 规则,
  QTreeWidget 未覆盖)
- QCheckBox: 新增全局 QSS,复选框文字色跟随主题,indicator 有明确的
  背景/边框/选中态/悬停态样式
MCPK 文件查看器表格启用 setAlternatingRowColors(True) 但未在 QSS
中定义交替色,导致 Qt 使用默认的灰色交替行与主题背景冲突、文字难以辨认。

修复:QSS 新增 alternate-background-color 和 ::item:alternate 规则,
交替行使用 LIST_ITEM 色(与主题卡片背景一致),确保所有行文字清晰。
恢复程序按钮(Windows .exe / Android .apk)的 QMenu 下拉菜单
之前没有 QSS 规则,文字使用 Qt 默认色(灰色),在深色主题下几乎不可见。
新增 QMenu/QMenu::item/QMenu::item:selected 规则,文字/背景/选中态全部跟随主题。
- QInputDialog: 新增背景色、标签文字色、输入框样式规则
- QLineEdit: 新增通用样式(背景、文字色、边框、聚焦态),之前只有 #neonInput 有
- QInputDialog 标题改为「开发者身份验证」避免窗口太窄截断标题
- 以上修复覆盖所有弹窗:开发者密码、新建分组、设置加密密码、手动输入魔术字
之前 QInputDialog 窗口太窄导致标题被截断为「身 ?」。
现在设置 QInputDialog min-width: 360px,确保「开发者身份验证」等标题完整显示。
- 新增 _themed_dialog() 统一给弹窗应用主题样式并强制最小宽度 480px
- 新增 _themed_get_text() 和 _themed_get_item() 包装所有文本/下拉输入弹窗
- 替换全部 6 处 QInputDialog.getText/getItem 调用:
  · 开发者身份验证 · 新建分组 · 设置加密密码
  · 铸造钥匙(魔术字) · 选择外壳文件 · MCPK 加密密码
- MCPKViewerDialog 中的密码弹窗也应用主题+宽度修复
@tripodxu
tripodxu force-pushed the refactor/phase1-phase2-engineering branch from 45c5fba to 2f2ed51 Compare September 2, 2026 15:26
@tripodxu
tripodxu merged commit 2f2ed51 into main Sep 2, 2026
12 checks passed
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