Skip to content

v0.1.8 — revert 回退 / --verify-fast / --strict / xlim v4 / check 真实文字尺寸

Choose a tag to compare

@shdbl shdbl released this 10 Oct 07:28
· 55 commits to main since this release

[0.1.8] — 2026-10-10

这一版把"布局调完能不能确定落地"这条链路补齐了:新增 revert 回退、
--verify-fast 快速档、--strict 严格档、轴范围 xlim/ylim(参数 schema v4)、
check 按真实渲染尺寸查文字,并修掉了 --json 输出编码与元组/带符号写法
原位写回等 6 个真 bug。测试:七套件 + pytest -q 25 项全绿(GBK 与 UTF-8 环境各跑一遍),
12 项反向验证全部命中;两个模型家族的独立只读审阅共 10 条发现全部修复。

修复

  • --json 成功路径的 stdout 不是 UTF-8:check / describe / apply --json / schema
    原先用 print(),在管道被捕获时按本地编码(中国 Windows 上是 cp936/GBK)输出;JSON 里
    只要有一个中文(check 的 msg、schema 的 description),按 UTF-8 解码的 agent / MCP
    客户端 / CI 就会直接崩。现在统一走 fd 级 UTF-8 写出(与失败路径 fail_json 一致)。
  • 顶层兜底 guard_json_main 在异常路径上失效:messages.py 用了 sys 却没 import,
    写出结构化 JSON 之后就在 sys.stderr.write 上抛 NameError,把本该打印的人话提示、
    MPLTWEAK_DEBUG 的 traceback 和 return 1 全部吃掉(用户看到的是与真实故障无关的 traceback)。
  • 元组/带符号写法的原位写回:原先只认列表字面量与 ast.Constant,于是
    add_axes((-0.01, ...))(元组)和 set_xlim(-0.01, 1.01)(负号在 AST 里是 UnaryOp)
    会被静默丢进"未原位应用"——用户看到的是"拖了没反应"。
  • --json 的 style 字段在写回时永远是 null:写回路径没设 style,导致 apply 永远走
    "已插入调整块"那条消息分支,"原位修改 N 处"永远打不出来,agent 也判断不了这次是哪种写回。
    (只读预览 --json 里 style 现在填请求的模式:auto 表示"逐图待定"——预览阶段还没决定
    这张图会不会退到块。)

新增

  • 布局引擎冲突检测(layoutwarn.py):静态扫描脚本,命中
    constrained_layout=True / layout='constrained'|'compressed' / set_constrained_layout /
    set_layout_engine / rcParams['figure.constrained_layout.use'] / rcParams['figure.autolayout']
    时给出带行号的提示与修复建议(launch 开窗前、apply 写回时、check 的 layout_engine 字段)。
    原因:布局引擎在每次绘制时重算轴位置,写回/拖拽的位置会被它覆盖,而旧行为只表现为一句
    "验证不一致",指不到病因。
  • mpltweak revert <脚本> [--write]:回退到上次写回之前(默认只预览)。用现成的
    .tweak_params/<脚本>.tweak.bak,自身也可逆(覆盖前把当前版本留成 <脚本>.revert.bak),
    恢复是字节级原样复制(BOM / 换行 / 编码不动)。
  • check 按真实渲染尺寸查文字:绘制一次后用 Text.get_window_extent() 量外框 ——
    超出画布 = 问题(客观可判定),文字互相压住 = 提示;同轴超长刻度标签按
    "沿刻度方向的重叠比例"判"太密"。纯几何框查不出这类问题。--no-text 可退回纯几何口径。
  • 轴范围 xlim / ylim(参数 schema v4):describe 采集(只在脚本显式固定过时才记,
    autoscale 不记),apply 原位改写 set_xlim(a, b) / set_xlim((a, b)) / set_xlim(xmin=, xmax=)
    三种写法,--style block 的调整块也会带上,写回后由语义验证比对范围是否真的等于参数。
  • check 轴范围不统一提示:多面板里 ≥60% 面板共享同一范围、另有少数不同 → 提示
    (各自为政的多面板图不报)。
  • --verify-fast 快速验证档:只做语法静态检查(写坏当场回滚),不重跑脚本;
    --json 标 verify_mode=fast + verified=null,人读输出原话说清"不保证能跑通、也不保证布局正确"。
  • --strict:check --strict 把布局引擎冲突升级为问题(rc=1,接 CI);
    apply --write --strict 在冲突时拒绝写回(--allow-layout-conflict 可放行)。
  • 轴网格身份 cell:参数里记录每个轴调图时的网格格位 [行数, 列数, 起始行, 起始列],
    写回后回比 —— 脚本改动导致轴序漂移时,语义验证会指名道姓地失败并回滚
    (而不是默默把位置套到别的面板上);调整块注释里也带出这份身份。
  • tests/test_hygiene.py(宽兜底棘轮 + 消息表 GBK 可编码 + 新模块登记)、
    tests/test_suites.py(pytest 包装)、tools/audit_exceptions.py(宽兜底清单与可窄化提示)。
  • CHANGELOG.md(本文件)。

文档

  • CONTRIBUTING.md:改正 Qt 依赖描述([qt] extra,不是默认依赖);补 pytest 路线、
    "加一套测试要改哪四处"、宽兜底棘轮与可窄化清单的用法。
  • README(中/英):新增 revert / --verify-fast / --strict 三节;「不适用场景」;
    「原位改数字 vs 插入调整块」(--style auto 的逐图判定、跨轮混用与彻底统一的正确做法);
    参数文件示例补 xlim / ylim / cell 并升到 v4;check 一行写清新增检查项。

测试:七套件 ALL PASS;pytest -q 25 passed(GBK 控制台与 UTF-8 两种环境各跑一遍);12 项反向验证全部命中;两个模型家族的独立只读审阅共 10 条发现全部修复。