Add bundled bus fonts and shared font favorites
@@ -0,0 +1,35 @@
|
||||
# 公交窄体首版验收
|
||||
|
||||
已制作、集成并部署“核桃公交窄体(推荐16px)”。字格 8×16,6763 个 GB2312 汉字、95 个可打印 ASCII、26 个标点/符号,共 6884 个码位。完整字模、42 项逐字修订、离线构建脚本、锁文件、wheel、上游许可和校验信息保存在 `核桃派软件源代码/font_sources/walnut-bus-8x16/`。字体本体为 `核桃派软件源代码/app/fonts/bundled/WalnutBus8x16.ttf`,摘要见 manifest 与 summary。
|
||||
|
||||
## 实际验证
|
||||
|
||||
- 本机 Python 相关套件 68 项及补充的新字体模板/裁切/回退测试 1 项通过;Node 字体选择器、场景、图层 24 项通过。
|
||||
- 全部 6884 个字符在 16px 下与字模逐像素一致,alpha 只有 0/255;非空字符无空白、无越格,最后一列保留间隔。32/48/64px 的重点字与整数倍最近邻放大一致。
|
||||
- 14 页最终字形图册分批查看;重复字形只有空格/全角空格。密度最高 32 字记录在 audit 中;复杂字简化边界保留,不以覆盖检查代替辨识率实验。
|
||||
- 带中文和空格的隔离副本从新建字体 venv、本地锁定 wheel 重建,TTF 字节一致,完整校样再次通过。
|
||||
- 网页实际搜索、选择、16px 设置及三行最终合成预览已检查,见 `网页最终预览.jpg`。截图来自本机 mock 页面,“未连接”状态仅指本机 mock 的设备网络信息,不代表部署失败。
|
||||
- 核桃派隔离候选中累计 68 项 Python 测试通过。1 项 Node 跨语言比较因板端没有 Node 跳过,同项已在本机通过,没有为本次字体任务增加板端 Node 依赖。
|
||||
- 部署前后 446 个原有持久文件摘要一致,只新增 1 个字体文件。真实 stop/start 的运行目录保留检查通过;后续真实 restart 后 447 个持久文件摘要一致,字体目录仍可用。
|
||||
- 设备实际 `/api/preview/text-layer` 返回的五组 PNG 在重启前后字节一致,解码后与本机预览逐像素一致。`device-*.png` 是设备原始透明预览;`设备渲染样张.png` 是关闭平滑的放大排版,不是摄像头画面。
|
||||
- H618 真实驱动仍可用,读取状态时最后错误、OE 错误及 safeoff 错误均为空。驱动参数和扫描实现未改;不据启动时刷新率采样值声称实屏视觉验收或刷新性能验收通过。
|
||||
|
||||
正式 VERSION 保持原值,没有导出 OTA/IMG、没有修改或发布 App。功能更新时间为 `2026-10-12T11:09+08:00`。未启动摄像头、未切换实屏测试图案,也没有物理接线或断电操作。
|
||||
|
||||
## 已修复的测试准备问题
|
||||
|
||||
首次 SFTP 直传任务运行目录失败:父目录仅 root 可访问,子目录 chown 无法绕过父目录权限。改用具名 `/var/tmp/` 暂存后由 sudo 转入任务目录,立即删除上传文件,没有放宽生产目录权限。
|
||||
|
||||
隔离候选首次遗漏 VERSION 导致测试无法收集,补齐后有 66 项通过、1 项 Node 比较跳过;另一个测试因遗漏 systemd 文件失败。补齐原生产 systemd 文件后定向重测该项通过。均未在失败状态下切换生产服务。记录中的旧部署路径来自板端历史 `.pyc` 的 traceback,不是对旧工作区的构建依赖。
|
||||
|
||||
可重复经验已更新到 `测试相关资料/如何测试/核桃派点阵屏控制服务测试流程.md` 的 TEST-BUS-FONT 条目。接缝合并、bearing、构建锁定和复杂字边界也记录在字体源目录 README。
|
||||
|
||||
## 回滚与清理
|
||||
|
||||
`rollback.tar.gz` 保存部署前被替换的程序文件,`deployed-files.json` 登记本轮程序文件;回滚时停服务、恢复 backup 中的旧文件,再移除登记的新增程序文件,然后启动并等待健康检查。持久字体、用户配置和用户资源不删除;保留运行目录,不修改 systemd unit。该备份不含设备凭据。
|
||||
|
||||
远端本轮候选、测试数据、程序备份和日志在归档拉回后清理,具体路径和结果见 `cleanup.json`。本机持续使用的字体构建环境保留在项目专用 `.local/font-build/`。临时网页与 mock 服务已关闭。本机 10 个具名任务目录及 7 个一次性辅助脚本的批量清理被安全策略拒绝,工具仅返回 blocked by policy,没有提供进一步原因;未换手段重试。本机这些文件仍在,已无用途,可由用户按 `cleanup.json` 的完整仓库相对路径手动删除;不得删除其中未列出的材料、持续环境或用户数据。
|
||||
|
||||
## 保留边界
|
||||
|
||||
8 列汉字不是标准印刷字形,罕用密集字(如鹤、警、藏、赢、鬻及密度榜中的字符)仍依赖简化和上下文;尚未做真实用户逐字辨识率测试。非 16px 整数倍字号不保证二值边缘。网页最终帧作为本轮视觉依据,不记录为物理实屏观察通过。
|
||||
@@ -0,0 +1,174 @@
|
||||
{
|
||||
"glyph_count": 6884,
|
||||
"grey": [],
|
||||
"blank": [],
|
||||
"right_edge_lit": [],
|
||||
"duplicates": [
|
||||
[
|
||||
"0020",
|
||||
"3000"
|
||||
]
|
||||
],
|
||||
"densest_32": [
|
||||
{
|
||||
"codepoint": "9190",
|
||||
"lit_pixels": 69,
|
||||
"density": 0.5390625
|
||||
},
|
||||
{
|
||||
"codepoint": "571C",
|
||||
"lit_pixels": 69,
|
||||
"density": 0.5390625
|
||||
},
|
||||
{
|
||||
"codepoint": "9CB4",
|
||||
"lit_pixels": 68,
|
||||
"density": 0.53125
|
||||
},
|
||||
{
|
||||
"codepoint": "91B4",
|
||||
"lit_pixels": 67,
|
||||
"density": 0.5234375
|
||||
},
|
||||
{
|
||||
"codepoint": "86D0",
|
||||
"lit_pixels": 67,
|
||||
"density": 0.5234375
|
||||
},
|
||||
{
|
||||
"codepoint": "7792",
|
||||
"lit_pixels": 67,
|
||||
"density": 0.5234375
|
||||
},
|
||||
{
|
||||
"codepoint": "5708",
|
||||
"lit_pixels": 67,
|
||||
"density": 0.5234375
|
||||
},
|
||||
{
|
||||
"codepoint": "916E",
|
||||
"lit_pixels": 66,
|
||||
"density": 0.515625
|
||||
},
|
||||
{
|
||||
"codepoint": "817C",
|
||||
"lit_pixels": 66,
|
||||
"density": 0.515625
|
||||
},
|
||||
{
|
||||
"codepoint": "811A",
|
||||
"lit_pixels": 66,
|
||||
"density": 0.515625
|
||||
},
|
||||
{
|
||||
"codepoint": "7784",
|
||||
"lit_pixels": 66,
|
||||
"density": 0.515625
|
||||
},
|
||||
{
|
||||
"codepoint": "64D0",
|
||||
"lit_pixels": 66,
|
||||
"density": 0.515625
|
||||
},
|
||||
{
|
||||
"codepoint": "5704",
|
||||
"lit_pixels": 66,
|
||||
"density": 0.515625
|
||||
},
|
||||
{
|
||||
"codepoint": "9E4F",
|
||||
"lit_pixels": 65,
|
||||
"density": 0.5078125
|
||||
},
|
||||
{
|
||||
"codepoint": "9B4D",
|
||||
"lit_pixels": 65,
|
||||
"density": 0.5078125
|
||||
},
|
||||
{
|
||||
"codepoint": "8774",
|
||||
"lit_pixels": 65,
|
||||
"density": 0.5078125
|
||||
},
|
||||
{
|
||||
"codepoint": "80F4",
|
||||
"lit_pixels": 65,
|
||||
"density": 0.5078125
|
||||
},
|
||||
{
|
||||
"codepoint": "7F71",
|
||||
"lit_pixels": 65,
|
||||
"density": 0.5078125
|
||||
},
|
||||
{
|
||||
"codepoint": "570A",
|
||||
"lit_pixels": 65,
|
||||
"density": 0.5078125
|
||||
},
|
||||
{
|
||||
"codepoint": "5703",
|
||||
"lit_pixels": 65,
|
||||
"density": 0.5078125
|
||||
},
|
||||
{
|
||||
"codepoint": "9CD3",
|
||||
"lit_pixels": 64,
|
||||
"density": 0.5
|
||||
},
|
||||
{
|
||||
"codepoint": "961A",
|
||||
"lit_pixels": 64,
|
||||
"density": 0.5
|
||||
},
|
||||
{
|
||||
"codepoint": "8DDA",
|
||||
"lit_pixels": 64,
|
||||
"density": 0.5
|
||||
},
|
||||
{
|
||||
"codepoint": "89D0",
|
||||
"lit_pixels": 64,
|
||||
"density": 0.5
|
||||
},
|
||||
{
|
||||
"codepoint": "89CF",
|
||||
"lit_pixels": 64,
|
||||
"density": 0.5
|
||||
},
|
||||
{
|
||||
"codepoint": "8334",
|
||||
"lit_pixels": 64,
|
||||
"density": 0.5
|
||||
},
|
||||
{
|
||||
"codepoint": "77B0",
|
||||
"lit_pixels": 64,
|
||||
"density": 0.5
|
||||
},
|
||||
{
|
||||
"codepoint": "77A9",
|
||||
"lit_pixels": 64,
|
||||
"density": 0.5
|
||||
},
|
||||
{
|
||||
"codepoint": "56EB",
|
||||
"lit_pixels": 64,
|
||||
"density": 0.5
|
||||
},
|
||||
{
|
||||
"codepoint": "56E4",
|
||||
"lit_pixels": 64,
|
||||
"density": 0.5
|
||||
},
|
||||
{
|
||||
"codepoint": "9F83",
|
||||
"lit_pixels": 63,
|
||||
"density": 0.4921875
|
||||
},
|
||||
{
|
||||
"codepoint": "9603",
|
||||
"lit_pixels": 63,
|
||||
"density": 0.4921875
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"removed": [
|
||||
"/run/matrix-screen-controller/bus-font-20261012",
|
||||
"/var/tmp/qms-bus-font-upload-20261012.tar"
|
||||
],
|
||||
"shared_runtime_preserved": true,
|
||||
"service_active": true,
|
||||
"font_available": true,
|
||||
"local_unused_manual_cleanup": [
|
||||
"测试相关资料/如何测试/本机测试环境/.local/work/公交 字体隔离",
|
||||
"测试相关资料/如何测试/本机测试环境/.local/work/bus-deploy",
|
||||
"测试相关资料/如何测试/本机测试环境/.local/work/bus-extra-pytest",
|
||||
"测试相关资料/如何测试/本机测试环境/.local/work/bus-font-proof-final",
|
||||
"测试相关资料/如何测试/本机测试环境/.local/work/bus-font-proof-v1",
|
||||
"测试相关资料/如何测试/本机测试环境/.local/work/bus-font-proof-v2",
|
||||
"测试相关资料/如何测试/本机测试环境/.local/work/bus-font-proof-v3",
|
||||
"测试相关资料/如何测试/本机测试环境/.local/work/bus-parity-data",
|
||||
"测试相关资料/如何测试/本机测试环境/.local/work/bus-pytest",
|
||||
"测试相关资料/如何测试/本机测试环境/.local/work/bus-web",
|
||||
"测试相关资料/如何测试/本机测试环境/.local/work/archive_bus_font.py",
|
||||
"测试相关资料/如何测试/本机测试环境/.local/work/bus_remote.py",
|
||||
"测试相关资料/如何测试/本机测试环境/.local/work/cleanup_bus_remote.py",
|
||||
"测试相关资料/如何测试/本机测试环境/.local/work/deploy_bus_font.py",
|
||||
"测试相关资料/如何测试/本机测试环境/.local/work/isolate_bus_font.py",
|
||||
"测试相关资料/如何测试/本机测试环境/.local/work/refine_bus_font.py",
|
||||
"测试相关资料/如何测试/本机测试环境/.local/work/verify_bus_device.py"
|
||||
],
|
||||
"local_cleanup_rejected": "blocked by policy; no further reason provided",
|
||||
"font_build_environment_retained": true,
|
||||
"mock_server_stopped": true
|
||||
}
|
||||
|
After Width: | Height: | Size: 30 KiB |
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"restorable_files": [
|
||||
"FEATURE_UPDATED_AT",
|
||||
"app/fonts/store.py",
|
||||
"tests/test_fonts.py"
|
||||
],
|
||||
"added_program_files": [
|
||||
"app/fonts/bundled/LICENSES/boutique-bitmap-7x7/OFL.txt",
|
||||
"app/fonts/bundled/LICENSES/galmuri/LICENSE.txt",
|
||||
"app/fonts/bundled/LICENSES/misaki/misaki.txt",
|
||||
"app/fonts/bundled/LICENSES/miseki-bitmap/LICENSE.txt",
|
||||
"app/fonts/bundled/OFL.txt",
|
||||
"app/fonts/bundled/WalnutBus8x16.ttf",
|
||||
"app/fonts/bundled/manifest.json",
|
||||
"font_sources/walnut-bus-8x16/README.md",
|
||||
"font_sources/walnut-bus-8x16/glyphs.json",
|
||||
"font_sources/walnut-bus-8x16/requirements-build.lock.txt",
|
||||
"font_sources/walnut-bus-8x16/revisions.json",
|
||||
"font_sources/walnut-bus-8x16/upstream/LICENSES/boutique-bitmap-7x7/OFL.txt",
|
||||
"font_sources/walnut-bus-8x16/upstream/LICENSES/galmuri/LICENSE.txt",
|
||||
"font_sources/walnut-bus-8x16/upstream/LICENSES/misaki/misaki.txt",
|
||||
"font_sources/walnut-bus-8x16/upstream/LICENSES/miseki-bitmap/LICENSE.txt",
|
||||
"font_sources/walnut-bus-8x16/upstream/OFL.txt",
|
||||
"font_sources/walnut-bus-8x16/upstream/fusion-8px-bdf.zip",
|
||||
"font_sources/walnut-bus-8x16/upstream/fusion-pixel-8px-monospaced-zh_hans.bdf",
|
||||
"font_sources/walnut-bus-8x16/upstream/source.json",
|
||||
"scripts/build_bus_font.py",
|
||||
"scripts/proof_bus_font.py",
|
||||
"tests/test_bus_font.py"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,235 @@
|
||||
|
||||
|
||||
|
||||
8d99e3cb8c63490e019dd3d567ba874dd75c250dc9b94fb0fb6097717568970d /run/[private]-screen-controller/bus-font-20261012/payload.tar
|
||||
|
||||
|
||||
==================================== ERRORS ====================================
|
||||
___________________ ERROR collecting tests/test_bus_font.py ____________________
|
||||
app/ota/versioning.py:36: in read_software_version
|
||||
return SoftwareVersion.parse(path.read_text(encoding="utf-8"))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
/usr/lib/python3.11/pathlib.py:1059: in read_text
|
||||
with self.open(mode='r', encoding=encoding, errors=errors) as f:
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
/usr/lib/python3.11/pathlib.py:1045: in open
|
||||
return io.open(self, mode, buffering, encoding, errors, newline)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
E FileNotFoundError: [Errno 2] No such file or directory: '/run/[private]-screen-controller/bus-font-20261012/candidate/VERSION'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/test_bus_font.py:16: in <module>
|
||||
from app.main import create_app
|
||||
app/main.py:2106: in <module>
|
||||
app = create_app(ui_copy_editor_build_enabled=UI_COPY_EDITOR_BUILD_ENABLED)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
app/main.py:449: in create_app
|
||||
software_version = read_software_version(code_root)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
app/ota/versioning.py:38: in read_software_version
|
||||
raise RuntimeError(f"software VERSION file is unreadable: {path}") from exc
|
||||
E RuntimeError: software VERSION file is unreadable: /run/[private]-screen-controller/bus-font-20261012/candidate/VERSION
|
||||
_____________________ ERROR collecting tests/test_fonts.py _____________________
|
||||
app/ota/versioning.py:36: in read_software_version
|
||||
return SoftwareVersion.parse(path.read_text(encoding="utf-8"))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
/usr/lib/python3.11/pathlib.py:1059: in read_text
|
||||
with self.open(mode='r', encoding=encoding, errors=errors) as f:
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
/usr/lib/python3.11/pathlib.py:1045: in open
|
||||
return io.open(self, mode, buffering, encoding, errors, newline)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
E FileNotFoundError: [Errno 2] No such file or directory: '/run/[private]-screen-controller/bus-font-20261012/candidate/VERSION'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
tests/test_fonts.py:12: in <module>
|
||||
from app.main import create_app
|
||||
app/main.py:2106: in <module>
|
||||
app = create_app(ui_copy_editor_build_enabled=UI_COPY_EDITOR_BUILD_ENABLED)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
app/main.py:449: in create_app
|
||||
software_version = read_software_version(code_root)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
app/ota/versioning.py:38: in read_software_version
|
||||
raise RuntimeError(f"software VERSION file is unreadable: {path}") from exc
|
||||
E RuntimeError: software VERSION file is unreadable: /run/[private]-screen-controller/bus-font-20261012/candidate/VERSION
|
||||
_________________ ERROR collecting tests/test_scene_layers.py __________________
|
||||
app/ota/versioning.py:36: in read_software_version
|
||||
return SoftwareVersion.parse(path.read_text(encoding="utf-8"))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
/usr/lib/python3.11/pathlib.py:1059: in read_text
|
||||
with self.open(mode='r', encoding=encoding, errors=errors) as f:
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
/usr/lib/python3.11/pathlib.py:1045: in open
|
||||
return io.open(self, mode, buffering, encoding, errors, newline)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
E FileNotFoundError: [Errno 2] No such file or directory: '/run/[private]-screen-controller/bus-font-20261012/candidate/VERSION'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
/usr/lib/python3.11/importlib/__init__.py:126: in import_module
|
||||
return _bootstrap._gcd_import(name[level:], package, level)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
<frozen importlib._bootstrap>:1206: in _gcd_import
|
||||
???
|
||||
<frozen importlib._bootstrap>:1178: in _find_and_load
|
||||
???
|
||||
<frozen importlib._bootstrap>:1149: in _find_and_load_unlocked
|
||||
???
|
||||
<frozen importlib._bootstrap>:690: in _load_unlocked
|
||||
???
|
||||
/opt/[private]-screen-controller/.venv/lib/python3.11/site-packages/_pytest/assertion/rewrite.py:186: in exec_module
|
||||
exec(co, module.__dict__)
|
||||
/opt/[private]-screen-controller.stage.animation-20261010-094a526b/tests/test_scene_layers.py:11: in <module>
|
||||
???
|
||||
app/main.py:2106: in <module>
|
||||
app = create_app(ui_copy_editor_build_enabled=UI_COPY_EDITOR_BUILD_ENABLED)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
app/main.py:449: in create_app
|
||||
software_version = read_software_version(code_root)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
app/ota/versioning.py:38: in read_software_version
|
||||
raise RuntimeError(f"software VERSION file is unreadable: {path}") from exc
|
||||
E RuntimeError: software VERSION file is unreadable: /run/[private]-screen-controller/bus-font-20261012/candidate/VERSION
|
||||
___________________ ERROR collecting tests/test_templates.py ___________________
|
||||
app/ota/versioning.py:36: in read_software_version
|
||||
return SoftwareVersion.parse(path.read_text(encoding="utf-8"))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
/usr/lib/python3.11/pathlib.py:1059: in read_text
|
||||
with self.open(mode='r', encoding=encoding, errors=errors) as f:
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
/usr/lib/python3.11/pathlib.py:1045: in open
|
||||
return io.open(self, mode, buffering, encoding, errors, newline)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
E FileNotFoundError: [Errno 2] No such file or directory: '/run/[private]-screen-controller/bus-font-20261012/candidate/VERSION'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
/usr/lib/python3.11/importlib/__init__.py:126: in import_module
|
||||
return _bootstrap._gcd_import(name[level:], package, level)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
<frozen importlib._bootstrap>:1206: in _gcd_import
|
||||
???
|
||||
<frozen importlib._bootstrap>:1178: in _find_and_load
|
||||
???
|
||||
<frozen importlib._bootstrap>:1149: in _find_and_load_unlocked
|
||||
???
|
||||
<frozen importlib._bootstrap>:690: in _load_unlocked
|
||||
???
|
||||
/opt/[private]-screen-controller/.venv/lib/python3.11/site-packages/_pytest/assertion/rewrite.py:186: in exec_module
|
||||
exec(co, module.__dict__)
|
||||
/opt/[private]-screen-controller.stage.animation-20261010-094a526b/tests/test_templates.py:10: in <module>
|
||||
???
|
||||
app/main.py:2106: in <module>
|
||||
app = create_app(ui_copy_editor_build_enabled=UI_COPY_EDITOR_BUILD_ENABLED)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
app/main.py:449: in create_app
|
||||
software_version = read_software_version(code_root)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
app/ota/versioning.py:38: in read_software_version
|
||||
raise RuntimeError(f"software VERSION file is unreadable: {path}") from exc
|
||||
E RuntimeError: software VERSION file is unreadable: /run/[private]-screen-controller/bus-font-20261012/candidate/VERSION
|
||||
______________________ ERROR collecting tests/test_api.py ______________________
|
||||
app/ota/versioning.py:36: in read_software_version
|
||||
return SoftwareVersion.parse(path.read_text(encoding="utf-8"))
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
/usr/lib/python3.11/pathlib.py:1059: in read_text
|
||||
with self.open(mode='r', encoding=encoding, errors=errors) as f:
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
/usr/lib/python3.11/pathlib.py:1045: in open
|
||||
return io.open(self, mode, buffering, encoding, errors, newline)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
E FileNotFoundError: [Errno 2] No such file or directory: '/run/[private]-screen-controller/bus-font-20261012/candidate/VERSION'
|
||||
|
||||
The above exception was the direct cause of the following exception:
|
||||
/usr/lib/python3.11/importlib/__init__.py:126: in import_module
|
||||
return _bootstrap._gcd_import(name[level:], package, level)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
<frozen importlib._bootstrap>:1206: in _gcd_import
|
||||
???
|
||||
<frozen importlib._bootstrap>:1178: in _find_and_load
|
||||
???
|
||||
<frozen importlib._bootstrap>:1149: in _find_and_load_unlocked
|
||||
???
|
||||
<frozen importlib._bootstrap>:690: in _load_unlocked
|
||||
???
|
||||
/opt/[private]-screen-controller/.venv/lib/python3.11/site-packages/_pytest/assertion/rewrite.py:186: in exec_module
|
||||
exec(co, module.__dict__)
|
||||
/opt/[private]-screen-controller.stage.animation-20261010-094a526b/tests/test_api.py:11: in <module>
|
||||
???
|
||||
app/main.py:2106: in <module>
|
||||
app = create_app(ui_copy_editor_build_enabled=UI_COPY_EDITOR_BUILD_ENABLED)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
app/main.py:449: in create_app
|
||||
software_version = read_software_version(code_root)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
app/ota/versioning.py:38: in read_software_version
|
||||
raise RuntimeError(f"software VERSION file is unreadable: {path}") from exc
|
||||
E RuntimeError: software VERSION file is unreadable: /run/[private]-screen-controller/bus-font-20261012/candidate/VERSION
|
||||
=========================== short test summary info ============================
|
||||
ERROR tests/test_bus_font.py - RuntimeError: software VERSION file is unreada...
|
||||
ERROR tests/test_fonts.py - RuntimeError: software VERSION file is unreadable...
|
||||
ERROR tests/test_scene_layers.py - RuntimeError: software VERSION file is unr...
|
||||
ERROR tests/test_templates.py - RuntimeError: software VERSION file is unread...
|
||||
ERROR tests/test_api.py - RuntimeError: software VERSION file is unreadable: ...
|
||||
!!!!!!!!!!!!!!!!!!! Interrupted: 5 errors during collection !!!!!!!!!!!!!!!!!!!!
|
||||
5 errors in 8.77s
|
||||
|
||||
|
||||
8d99e3cb8c63490e019dd3d567ba874dd75c250dc9b94fb0fb6097717568970d /run/[private]-screen-controller/bus-font-20261012/payload.tar
|
||||
|
||||
.....................s........................................F..... [100%]
|
||||
=================================== FAILURES ===================================
|
||||
____ test_systemd_preserves_runtime_marker_across_service_stop_and_restart _____
|
||||
/opt/[private]-screen-controller.stage.animation-20261010-094a526b/tests/test_api.py:1144: in test_systemd_preserves_runtime_marker_across_service_stop_and_restart
|
||||
???
|
||||
/usr/lib/python3.11/pathlib.py:1059: in read_text
|
||||
with self.open(mode='r', encoding=encoding, errors=errors) as f:
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
/usr/lib/python3.11/pathlib.py:1045: in open
|
||||
return io.open(self, mode, buffering, encoding, errors, newline)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
E FileNotFoundError: [Errno 2] No such file or directory: '/run/[private]-screen-controller/bus-font-20261012/candidate/systemd/[private]-screen-controller.service'
|
||||
=========================== short test summary info ============================
|
||||
FAILED tests/test_api.py::test_systemd_preserves_runtime_marker_across_service_stop_and_restart
|
||||
1 failed, 66 passed, 1 skipped, 165 warnings in 239.70s (0:03:59)
|
||||
|
||||
|
||||
8d99e3cb8c63490e019dd3d567ba874dd75c250dc9b94fb0fb6097717568970d /run/[private]-screen-controller/bus-font-20261012/payload.tar
|
||||
|
||||
. [100%]
|
||||
1 passed, 67 deselected, 4 warnings in 7.18s
|
||||
|
||||
{"result": "deployed", "preserved_files": 446, "added_fonts": 1, "runtime_survived_stop": true, "manifest": {"id": "builtin:walnut-bus-8x16", "file": "WalnutBus8x16.ttf", "sha256": "d38bf29d6408a6f731865a1ca760a80b5156ebf6ab96d5ad8d649df28163564c", "label": "核桃公交窄体(推荐16px)", "family": "核桃公交窄体", "style": "Regular", "glyph_count": 6884, "recommended_size": 16, "cell": [8, 16]}, "status_keys": ["frp", "mobile", "network", "ok", "power", "resources", "screen", "service", "state", "system", "ui"]}
|
||||
|
||||
{
|
||||
"result": "deployed",
|
||||
"preserved_files": 446,
|
||||
"added_fonts": 1,
|
||||
"runtime_survived_stop": true,
|
||||
"manifest": {
|
||||
"id": "builtin:walnut-bus-8x16",
|
||||
"file": "WalnutBus8x16.ttf",
|
||||
"sha256": "d38bf29d6408a6f731865a1ca760a80b5156ebf6ab96d5ad8d649df28163564c",
|
||||
"label": "核桃公交窄体(推荐16px)",
|
||||
"family": "核桃公交窄体",
|
||||
"style": "Regular",
|
||||
"glyph_count": 6884,
|
||||
"recommended_size": 16,
|
||||
"cell": [
|
||||
8,
|
||||
16
|
||||
]
|
||||
},
|
||||
"status_keys": [
|
||||
"frp",
|
||||
"mobile",
|
||||
"network",
|
||||
"ok",
|
||||
"power",
|
||||
"resources",
|
||||
"screen",
|
||||
"service",
|
||||
"state",
|
||||
"system",
|
||||
"ui"
|
||||
]
|
||||
}
|
||||
|
After Width: | Height: | Size: 306 B |
|
After Width: | Height: | Size: 277 B |
|
After Width: | Height: | Size: 241 B |
|
After Width: | Height: | Size: 300 B |
|
After Width: | Height: | Size: 343 B |
|
After Width: | Height: | Size: 82 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 86 KiB |
|
After Width: | Height: | Size: 86 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 84 KiB |
|
After Width: | Height: | Size: 88 KiB |
|
After Width: | Height: | Size: 85 KiB |
|
After Width: | Height: | Size: 87 KiB |
|
After Width: | Height: | Size: 44 KiB |
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"result": "deployed",
|
||||
"preserved_files": 446,
|
||||
"added_fonts": 1,
|
||||
"runtime_survived_stop": true,
|
||||
"manifest": {
|
||||
"id": "builtin:walnut-bus-8x16",
|
||||
"file": "WalnutBus8x16.ttf",
|
||||
"sha256": "d38bf29d6408a6f731865a1ca760a80b5156ebf6ab96d5ad8d649df28163564c",
|
||||
"label": "核桃公交窄体(推荐16px)",
|
||||
"family": "核桃公交窄体",
|
||||
"style": "Regular",
|
||||
"glyph_count": 6884,
|
||||
"recommended_size": 16,
|
||||
"cell": [
|
||||
8,
|
||||
16
|
||||
]
|
||||
},
|
||||
"status_keys": [
|
||||
"frp",
|
||||
"mobile",
|
||||
"network",
|
||||
"ok",
|
||||
"power",
|
||||
"resources",
|
||||
"screen",
|
||||
"service",
|
||||
"state",
|
||||
"system",
|
||||
"ui"
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:3bee3131dc687230ec0f39eb22b7e8a26ae8a866a6ce2481018b9dbca3d7f67f
|
||||
size 5744
|
||||
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"font_sha256": "d38bf29d6408a6f731865a1ca760a80b5156ebf6ab96d5ad8d649df28163564c",
|
||||
"glyph_count": 6884,
|
||||
"han_count": 6763,
|
||||
"manual_revisions": 42,
|
||||
"local_python_passed": 69,
|
||||
"frontend_node_passed": 24,
|
||||
"device_python_passed": 68,
|
||||
"device_skipped": 1,
|
||||
"device_skip_reason": "Node cross-language parity is local-only; passed locally",
|
||||
"isolated_rebuild_identical": true,
|
||||
"pixel_parity": {
|
||||
"route": true,
|
||||
"market": true,
|
||||
"dense": true,
|
||||
"latin": true,
|
||||
"large": true
|
||||
},
|
||||
"inspected_glyph_sheets": [
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
8,
|
||||
9,
|
||||
10,
|
||||
11,
|
||||
12,
|
||||
13,
|
||||
14
|
||||
],
|
||||
"known_limits": [
|
||||
"8-column complex glyphs use reduced forms; rare dense characters benefit from context",
|
||||
"nonmultiples of 16px are not guaranteed binary"
|
||||
],
|
||||
"camera_used": false,
|
||||
"physical_screen_visual_verification": false
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"restart_preserved_files": 447,
|
||||
"preview_restart_identical": true,
|
||||
"screen": {
|
||||
"width": 64,
|
||||
"height": 64,
|
||||
"driver": "walnutpi-h618-hub75",
|
||||
"driver_available": true,
|
||||
"driver_error": null,
|
||||
"hardware_mapping": "walnutpi-pi-bank-pwm-oe-v2",
|
||||
"driver_options": {
|
||||
"rows": 64,
|
||||
"cols": 64,
|
||||
"scan_rows": 32,
|
||||
"row_address_bits": 5,
|
||||
"pwm_bits": 7,
|
||||
"hardware_mapping": "walnutpi-pi-bank-pwm-oe-v2",
|
||||
"brightness": 40,
|
||||
"limit_refresh_rate_hz": 100,
|
||||
"pio_base": "0x0300B000",
|
||||
"pi_bank_offset": "0x120",
|
||||
"data_offset": "0x10",
|
||||
"cpu_affinity": 3,
|
||||
"realtime_priority": 50
|
||||
},
|
||||
"driver_status": {
|
||||
"actual_refresh_rate_hz": 0.0,
|
||||
"panel_scan_rate_hz": 0.0,
|
||||
"completed_frames": 193,
|
||||
"completed_scans": 193,
|
||||
"scans_per_frame": 1,
|
||||
"deadline_misses": 0,
|
||||
"buffer_swaps": 4,
|
||||
"submitted_frames": 4,
|
||||
"oe_timing_backend": "h618-pwm4",
|
||||
"oe_pulse_faults": 0,
|
||||
"oe_forced_blanks": 0,
|
||||
"max_programmed_oe_ns": 128000,
|
||||
"oe_timing_error": null,
|
||||
"safeoff_error": null,
|
||||
"cpu_affinity": 3,
|
||||
"cpu_affinity_active": true,
|
||||
"cpu_affinity_error": null,
|
||||
"realtime_priority": 50,
|
||||
"realtime_priority_active": true,
|
||||
"realtime_priority_error": null,
|
||||
"memory_locked": true,
|
||||
"memory_lock_error": null,
|
||||
"running": true,
|
||||
"governor": "ondemand",
|
||||
"last_error": null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 50 KiB |
|
After Width: | Height: | Size: 11 KiB |