Improve Android app UI and controller flows
@@ -0,0 +1,52 @@
|
||||
# 网页多图层与扩展画布实施验收(2026-10-09)
|
||||
|
||||
实施范围:scene v2、模板schema v2、动图schema v3、配置v11;192×192逻辑编辑区和64×64输出;画笔/多段文字图层、背景、复制/排序/命名、位移和持久裁切。VERSION保持1.1.3,功能时间2026-10-09T15:27+08:00。未导出OTA/IMG。
|
||||
|
||||
## 验收覆盖
|
||||
|
||||
| 行为 | 证据 |
|
||||
| --- | --- |
|
||||
| 图层增删、至少一画笔、多段文字隔离、复制/排序/重命名 | Node模型测试;桌面浏览器入口check_layers_browser.mjs |
|
||||
| 透明空白、黑色遮挡、各层背景/关闭颜色记忆、擦除/清空 | Node/Pillow合成;浏览器背景操作 |
|
||||
| 192外围、扩展开关记忆、中央64边框、64输出 | 浏览器/节点;Python PNG逐像素对比 |
|
||||
| 图层移动、偏移提交/步进/限位;视线不改内容 | 浏览器桌面鼠标和移动触摸;模型测试 |
|
||||
| 越界确认取消、文字部分裁切/全删、移回不恢复、缩放与重载、撤销 | 6次原生确认的浏览器验收及模型/持久化测试 |
|
||||
| 保存/复制静态与单帧/多帧/全部帧、冲突、脏目标保存 | 浏览器操作及REST/存储测试 |
|
||||
| 场景/缩略图/索引写入故障、重启无半提交 | 动图存储事务故障注入测试 |
|
||||
| 旧草稿/模板/动图迁移中央输出一致、损坏保全 | Node/Python严格迁移测试;设备原数据摘要比对 |
|
||||
| 手机共享内容库/播放接口兼容 | 相关Python协议测试;App无需更新 |
|
||||
| 桌面/390px/320px悬浮菜单及面板、文字拖动/字号、触摸/视线缩放 | 本目录截图、浏览器正常UI输入验证 |
|
||||
|
||||
绕开正常路径的验证包含:确认取消后草稿完全一致、移回后不恢复已裁内容、迟到文字请求不覆盖新状态、If-Match过期冲突、两帧部分写入失败全部保全,以及旧草稿未知字段/不合法数字拒绝迁移。
|
||||
|
||||
## 已完成本机检查
|
||||
|
||||
最后版本本机全套513通过/9跳过(all-ready.log),上一轮512通过/9跳过(all-final-retest.log);最新迁移边界59通过;全部Node87通过/无跳过。隔离中文空格目录全套499通过/11跳过,最新相关59通过。隔离副本未复制凭据、旧venv或运行数据,使用现有解释器运行其源码。各结果存在重叠,不相加。
|
||||
|
||||
本机9跳过:6个视频格式测试的默认环境没有FFmpeg、libheif编码器1项、Windows目录symlink1项、只供旧OTA隔离子进程的probe1项。随后复用已有FFmpeg单独执行6项视频格式并通过,HEIC编码器仍未提供。隔离目录另有完整Git工作区和发行构建依赖缺省导致的2项跳过。无需摄像头、实屏视觉、Android真机回归。
|
||||
|
||||
Windows一次媒体任务原子替换WinError5已保留失败日志all-final.log;单测重测与关闭本轮浏览器/mock后的完整回归通过。较早隔离迁移目录rename及WiFi替换也曾偶发拒绝访问;未证实根因,未修改无关持久化实现。经验已登记测试流程。
|
||||
|
||||
## 部署验证
|
||||
|
||||
通过私有凭据门禁和远端工具检查,上传离线载荷并核验SHA-256,使用既有update_walnutpi.sh在数据副本上迁移及完整预检,原子切换后健康检查并重启。本轮未更新驱动源码,也未发送实屏诊断图案。
|
||||
|
||||
部署前基线9个模板、6个动图、195帧。既有名称/顺序/间隔、64输出摘要、配置和其余持久文件逐项对比;允许清理13个不属于当前修订的严格命名手机缩略图缓存,未泛化忽略mobile目录。旧缓存失效是scene摘要改变后既有PreviewCache.reconcile的预期清理。
|
||||
|
||||
板端存在原有BlueZ LEAdvertisement1 TxPower属性告警,服务启动及健康通过;此告警未在本轮修改范围处理,不写为已消除。相关共享协议回归通过。
|
||||
|
||||
## 可重复入口和经验
|
||||
|
||||
稳定需求见整体开发需求/01_网页配置端需求.md;测试映射与经验见测试相关资料/如何测试/核桃派点阵屏控制服务测试流程.md;跨端兼容见移动端相关内容/开发要求/跨端兼容与变更记录.md。浏览器入口为核桃派软件源代码/scripts/check_layers_browser.mjs,调用方提供已有Playwright page与隔离mock URL。一次性SSH载荷、设备测试脚本和隔离测试数据在本轮完成后精确清理,持续使用的测试环境、凭据与主机密钥保留。
|
||||
|
||||
最后部署版本的板端预检508通过/7跳过(device-deployment-deploy-ready.log),完整重启和健康检查通过。7跳过对应源载荷没有完整Git1项、没有本机harness3项、没有大型镜像构建依赖1项、板端没有Node的跨语言对比1项,以及旧OTA子进程probe1项;Node/Pillow对比已在本机执行。
|
||||
|
||||
设备实际REST保存重载、中央PNG输出、文字裁切状态、独立图层ID、单帧/全部帧追加、原间隔及If-Match冲突、64/192文字预览全部通过(device-rest.log)。测试创建的独立模板与两帧动图均删除;之后基线复核9模板/6动图/195帧以及其他业务持久文件全部保持一致(device-ready-verification.log)。
|
||||
|
||||
最终网页桌面验收通过、6次原生确认、无pageerror;320px窄屏触摸整层X移动10像素、中央屏幕边框可见,切到视线模式后重新打开菜单仍可使用偏移面板。菜单坐标x74/y394、尺寸224×438,在320×844视口内,更多控件可滚动。截图见device-desktop-menu.png和device-mobile-menu.png;结果见device-browser.json。一次性浏览器操作曾引用错误的canvas选择器及错误地二次切换已打开菜单,导致自动化超时;改为实际DOM选择器和逐步检查后通过,应用源码无需修改。
|
||||
|
||||
校验已安装的33个变更/新增源码文件SHA-256与本机一致;VERSION为1.1.3、FEATURE_UPDATED_AT为2026-10-09T15:27+08:00(installed-source.log)。驱动截止丢失0、OE脉冲故障0、最后错误null;未改变显示模式进行视觉测试。
|
||||
|
||||
已清理远端本轮独立目录 `/run/matrix-screen-controller-layers-20261009`,其中包括离线部署tar、wheel副本、frpc副本、测试脚本和文件校验清单(device-cleanup.log);更新脚本的stage/data副本由既有事务清理。浏览器与本轮SSH本地转发已关闭。本机一次性目录 `测试相关资料/如何测试/本机测试环境/.local/work/layers-implementation` 的精确删除被自动安全审批拒绝(仅返回 blocked by policy),未更换手段重试。该目录已无使用进程、所需证据已归档,可由用户手动删除;测试venv、私有凭据及主机密钥继续保留。
|
||||
|
||||
最后再次比对所有设备用户内容并确认37个本轮远端载荷、stage、rollback、迁移及测试绝对路径均不存在(device-cleanup-confirmed.log)。本机安全拦截使删除临时目录与随后检查的组合命令整体未执行;本轮仅重新执行证据复制及只读检查,未再次请求删除。
|
||||
@@ -0,0 +1,248 @@
|
||||
requirements 未变化,跳过依赖安装。
|
||||
> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe -m pip check
|
||||
No broken requirements found.
|
||||
已清理:<仓库根目录>\测试相关资料\如何测试\本机测试环境\work\pytest
|
||||
> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe -m pytest -q -p no:cacheprovider --basetemp=<仓库根目录>\测试相关资料\如何测试\本机测试环境\work\pytest
|
||||
........................................................................ [ 13%]
|
||||
........................................................................ [ 27%]
|
||||
........................................................................ [ 41%]
|
||||
....................................sssssss.......s..................... [ 55%]
|
||||
........................................................................ [ 69%]
|
||||
.......s................................................................ [ 82%]
|
||||
........................................................................ [ 96%]
|
||||
................. [100%]
|
||||
============================== warnings summary ===============================
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15
|
||||
@no_type_check_decorator
|
||||
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: 10 warnings
|
||||
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15
|
||||
@no_type_check_decorator
|
||||
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: 83 warnings
|
||||
tests/test_animations.py: 913 warnings
|
||||
tests/test_api.py: 2075 warnings
|
||||
tests/test_fonts.py: 249 warnings
|
||||
tests/test_frp.py: 332 warnings
|
||||
tests/test_library_order.py: 332 warnings
|
||||
tests/test_media_conversion.py: 830 warnings
|
||||
tests/test_mobile_control.py: 1162 warnings
|
||||
tests/test_ota.py: 249 warnings
|
||||
tests/test_performance_mode.py: 83 warnings
|
||||
tests/test_scene_layers.py: 166 warnings
|
||||
tests/test_templates.py: 664 warnings
|
||||
tests/test_ui_copy_editor.py: 599 warnings
|
||||
tests/test_wifi.py: 249 warnings
|
||||
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead
|
||||
is_coroutine = asyncio.iscoroutinefunction(dependant.call)
|
||||
|
||||
app\main.py:2049: 1 warning
|
||||
tests/test_animations.py: 11 warnings
|
||||
tests/test_api.py: 25 warnings
|
||||
tests/test_fonts.py: 3 warnings
|
||||
tests/test_frp.py: 4 warnings
|
||||
tests/test_library_order.py: 4 warnings
|
||||
tests/test_media_conversion.py: 10 warnings
|
||||
tests/test_mobile_control.py: 14 warnings
|
||||
tests/test_ota.py: 3 warnings
|
||||
tests/test_performance_mode.py: 1 warning
|
||||
tests/test_scene_layers.py: 2 warnings
|
||||
tests/test_templates.py: 8 warnings
|
||||
tests/test_ui_copy_editor.py: 7 warnings
|
||||
tests/test_wifi.py: 3 warnings
|
||||
<仓库根目录>\核桃派软件源代码\app\main.py:2049: DeprecationWarning:
|
||||
on_event is deprecated, use lifespan event handlers instead.
|
||||
|
||||
Read more about it in the
|
||||
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
|
||||
|
||||
@app.on_event("startup")
|
||||
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: 2 warnings
|
||||
tests/test_animations.py: 22 warnings
|
||||
tests/test_api.py: 50 warnings
|
||||
tests/test_fonts.py: 6 warnings
|
||||
tests/test_frp.py: 8 warnings
|
||||
tests/test_library_order.py: 8 warnings
|
||||
tests/test_media_conversion.py: 20 warnings
|
||||
tests/test_mobile_control.py: 28 warnings
|
||||
tests/test_ota.py: 6 warnings
|
||||
tests/test_performance_mode.py: 2 warnings
|
||||
tests/test_scene_layers.py: 4 warnings
|
||||
tests/test_templates.py: 16 warnings
|
||||
tests/test_ui_copy_editor.py: 14 warnings
|
||||
tests/test_wifi.py: 6 warnings
|
||||
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: DeprecationWarning:
|
||||
on_event is deprecated, use lifespan event handlers instead.
|
||||
|
||||
Read more about it in the
|
||||
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
|
||||
|
||||
return self.router.on_event(event_type)
|
||||
|
||||
app\main.py:2079: 1 warning
|
||||
tests/test_animations.py: 11 warnings
|
||||
tests/test_api.py: 25 warnings
|
||||
tests/test_fonts.py: 3 warnings
|
||||
tests/test_frp.py: 4 warnings
|
||||
tests/test_library_order.py: 4 warnings
|
||||
tests/test_media_conversion.py: 10 warnings
|
||||
tests/test_mobile_control.py: 14 warnings
|
||||
tests/test_ota.py: 3 warnings
|
||||
tests/test_performance_mode.py: 1 warning
|
||||
tests/test_scene_layers.py: 2 warnings
|
||||
tests/test_templates.py: 8 warnings
|
||||
tests/test_ui_copy_editor.py: 7 warnings
|
||||
tests/test_wifi.py: 3 warnings
|
||||
<仓库根目录>\核桃派软件源代码\app\main.py:2079: DeprecationWarning:
|
||||
on_event is deprecated, use lifespan event handlers instead.
|
||||
|
||||
Read more about it in the
|
||||
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
|
||||
|
||||
@app.on_event("shutdown")
|
||||
|
||||
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
|
||||
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
|
||||
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
|
||||
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
|
||||
<仓库根目录>\核桃派软件源代码\tests\test_media_conversion.py:134: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead.
|
||||
assert sum(pixel[0] > 240 for pixel in output.getdata()) == 1
|
||||
|
||||
tests/test_templates.py::test_template_crud_copy_persistence_and_thumbnail_cleanup
|
||||
<仓库根目录>\核桃派软件源代码\tests\test_templates.py:165: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead.
|
||||
assert len(set(image.getdata())) > 1
|
||||
|
||||
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
|
||||
512 passed, 9 skipped, 8390 warnings in 162.85s (0:02:42)
|
||||
> "C:\Program Files\nodejs\node.EXE" --test tests/test_animation_ui.mjs tests/test_canvas_tools.mjs tests/test_color_math.mjs tests/test_current_display_playback_ui.mjs tests/test_device_ui.mjs tests/test_font_picker.mjs tests/test_frp_ui.mjs tests/test_interaction_feedback.mjs tests/test_scene_model.mjs tests/test_scene_layers.mjs tests/test_settings_ui.mjs tests/test_template_management_ui.mjs tests/test_ui_copy_editor.mjs tests/test_wifi_ui.mjs tests/test_workspace_order_ui.mjs
|
||||
✔ derives automatic frame names from current animation name and position (0.8905ms)
|
||||
✔ keeps custom frame names and restores automatic names when cleared (0.1147ms)
|
||||
✔ builds non-repeating animation edit context names (0.1237ms)
|
||||
✔ selects saved animation preview frames by ordered durations (0.764ms)
|
||||
✔ loads every preview frame through revision-checked pagination (0.6488ms)
|
||||
✔ validates configurable animation preview concurrency (0.3821ms)
|
||||
✔ rejects mixed revisions instead of showing a partial animation (1.5654ms)
|
||||
✔ validates frame duration only when explicitly called (0.4885ms)
|
||||
✔ moves selected frames as one ordered group (0.2723ms)
|
||||
✔ protects an eight pixel ring around interactive drag controls (0.2357ms)
|
||||
✔ reorders mixed library keys without mutating the source list (0.1522ms)
|
||||
✔ restores drag eligibility after protected pointer cancellation and drag end (0.5359ms)
|
||||
✔ animation workspace exposes two previews and the simplified control order (7.0698ms)
|
||||
✔ normal and pixel modes expose independent ranges and presets (1.3121ms)
|
||||
✔ pixel stamps are exact squares from 1x1 through 4x4 (0.2387ms)
|
||||
✔ pixel stamps clip at every canvas edge (0.1973ms)
|
||||
✔ normal circle geometry remains unchanged (0.0999ms)
|
||||
✔ line interpolation includes endpoints without coordinate gaps (0.2263ms)
|
||||
✔ older tools migrate while v3 restores the coordinate guide choice (0.2476ms)
|
||||
✔ coordinate guide spacing adapts to the transformed logical pixel size (0.1444ms)
|
||||
✔ coordinate guide ticks preserve logical values through zoom and pan (0.2051ms)
|
||||
✔ pixel mode markup and grid stay accessible and non-interactive (9.0143ms)
|
||||
✔ pixel undo history stores changed snapshots, caps entries, and clears (0.5226ms)
|
||||
✔ canvas view clamps scale and keeps a visible section in the viewport (0.2232ms)
|
||||
✔ zooming around an anchor preserves its logical position (0.2588ms)
|
||||
✔ floating editor button stays inside its safe viewport bounds (0.1569ms)
|
||||
✔ canvas editor markup, guarded input, and checkpoint events stay wired (5.1933ms)
|
||||
✔ normalizes and converts hexadecimal colors (1.3708ms)
|
||||
✔ converts RGB and HSV boundaries (0.2687ms)
|
||||
✔ round trips representative colors within 8-bit rounding (0.2699ms)
|
||||
✔ recent colors deduplicate, normalize, and evict the oldest (0.3041ms)
|
||||
✔ formats and projects looping playback without moving paused content (1.121ms)
|
||||
✔ seek dispatcher keeps one request in flight and flushes the newest position (4.2348ms)
|
||||
✔ topbar current display dialog exposes static close and animation controls (6.5266ms)
|
||||
✔ device workspace exposes the compact immediate pure-color test flow (6.1077ms)
|
||||
✔ font catalog normalization, grouping, and search are stable (1.2991ms)
|
||||
✔ font picker implements commit-only searchable combobox keyboard behavior (4.3202ms)
|
||||
✔ settings places unrestricted FRP maintenance at the bottom (4.7159ms)
|
||||
✔ FRP editor uses raw server storage and official validation errors (1.1139ms)
|
||||
✔ network diagnostics renders layered evidence (1.7464ms)
|
||||
✔ unavailable controls never masquerade as indefinite loading (6.3779ms)
|
||||
✔ action controls do not bypass the shared state module (7.9189ms)
|
||||
✔ HTTP requests time out with a stable user-facing error (15.7531ms)
|
||||
✔ demo library actions stay black, explain restrictions, and preserve copy (1.5646ms)
|
||||
✔ sortable cards protect controls and keep demo cards fixed (1.4711ms)
|
||||
✔ old scene migration rejects unknown fields and duplicate text without filtering (9.4326ms)
|
||||
✔ PNG compression round trips sparse and full brush pixels without DOM (18.4773ms)
|
||||
✔ blank and black are distinct; independent backgrounds follow layer order (5.5719ms)
|
||||
✔ disabled background colors stay independent through storage and copy (18.2751ms)
|
||||
✔ extended pixels survive storage but never enter the central output (5.6184ms)
|
||||
✔ move preview does not mutate source; confirmed clipping removes only outside ink (20.7736ms)
|
||||
✔ text clipping follows anchor and scale and is retained after edit/reload/copy (6.3203ms)
|
||||
✔ multiple text groups isolate edits, copies and IDs (0.5384ms)
|
||||
✔ strict v2 storage protects unknown data and the final brush invariant (2.9911ms)
|
||||
✔ creates a fixed 64x64 RGB scene (8.3545ms)
|
||||
✔ serializes pixelRgb as base64 and round trips an independent scene (30.0145ms)
|
||||
✔ moves a valid v1 draft to the stable key before removing exact legacy keys (22.8032ms)
|
||||
✔ keeps the v1 draft and all legacy keys when stable-key migration cannot write (6.6069ms)
|
||||
✔ preserves and blocks a future stable draft instead of falling back or writing blank (7.6802ms)
|
||||
✔ preserves and blocks a damaged stable draft (0.9426ms)
|
||||
✔ does not discard a damaged higher-priority legacy key during fallback migration (2.7322ms)
|
||||
✔ rejects damaged scene roots while skipping only damaged elements (5.4182ms)
|
||||
✔ normalizes text fields and creates a centered lowercase ok element (0.2989ms)
|
||||
✔ migrates the first valid canvas by v3, v2, legacy priority and merges text v1 (8.9943ms)
|
||||
✔ supports independent add, update, and delete operations for multiple text elements (1.1051ms)
|
||||
✔ duplicates with a deep copy, new id, 2px offset, and topmost order (0.324ms)
|
||||
✔ alpha-composites full RGBA layers in array order without mutating inputs (2.0929ms)
|
||||
✔ settings brightness explains an active temporary display-test override (6.587ms)
|
||||
✔ settings exposes full OTA upload progress and service recovery polling (4.7051ms)
|
||||
✔ settings automatically opens and safely copies a detailed OTA failure log (2.3833ms)
|
||||
✔ settings exposes a transactional performance-mode switch with the fixed warning (1.496ms)
|
||||
✔ settings exposes persisted animation preview concurrency below performance mode (1.9836ms)
|
||||
✔ template edit baseline distinguishes clean, dirty, and unbound scenes (2.2967ms)
|
||||
✔ template manager uses a monitor and unified four-row card actions (6.6472ms)
|
||||
✔ animation editing backs up and restores template edit ownership (1.4212ms)
|
||||
✔ special editor exposes the agreed modes and guarded editing flow (5.8489ms)
|
||||
✔ latched WiFi draft state remains dirty until explicitly cleared (1.2836ms)
|
||||
✔ WiFi settings expose independent network and prompt-delay controls (2.6322ms)
|
||||
✔ workspace order resolves saved ids and appends new registrations (1.1186ms)
|
||||
✔ workspace order movement is immutable and respects both boundaries (0.2128ms)
|
||||
✔ drawer exposes one editable list and commits only from the save action (5.9252ms)
|
||||
ℹ tests 81
|
||||
ℹ suites 0
|
||||
ℹ pass 81
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 594.5022
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\animation-thumbnail-preview.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\animation-ui-model.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\app.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\canvas-tools-model.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\color-math.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\color-picker.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\core.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\current-display-playback.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\font-picker.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\interaction-feedback.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\media-crop-geometry.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\media-import-ui-model.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\pixel-png.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\scene-board.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\scene-model-v1.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\scene-model.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\sortable-card.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\template-edit-model.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\ui-copy-runtime.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\vendor\fflate\fflate.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\animations.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\canvas.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\device.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\frp-settings.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\layers.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\media-import.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\settings.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\templates.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\text.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\wifi-settings.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\wifi-draft-state.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\workspace-order.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check app/ui_copy_editor/static/editor.js
|
||||
> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe scripts/build_ui_copy_catalog.py --check
|
||||
ui-copy.json is current
|
||||
本机测试套件通过:all
|
||||
@@ -0,0 +1,679 @@
|
||||
requirements 未变化,跳过依赖安装。
|
||||
> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe -m pip check
|
||||
No broken requirements found.
|
||||
已清理:<仓库根目录>\测试相关资料\如何测试\本机测试环境\work\pytest
|
||||
> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe -m pytest -q -p no:cacheprovider --basetemp=<仓库根目录>\测试相关资料\如何测试\本机测试环境\work\pytest
|
||||
........................................................................ [ 13%]
|
||||
........................................................................ [ 27%]
|
||||
........................................................................ [ 41%]
|
||||
...................................Fsssssss.......s..................... [ 55%]
|
||||
........................................................................ [ 69%]
|
||||
.......s................................................................ [ 82%]
|
||||
........................................................................ [ 96%]
|
||||
................. [100%]
|
||||
================================== FAILURES ===================================
|
||||
__ test_media_settings_api_accepts_outside_centers_but_rejects_an_empty_view __
|
||||
+ Exception Group Traceback (most recent call last):
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_utils.py", line 79, in collapse_excgroups
|
||||
| yield
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py", line 183, in __call__
|
||||
| async with anyio.create_task_group() as task_group:
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\_backends\_asyncio.py", line 815, in __aexit__
|
||||
| raise BaseExceptionGroup(
|
||||
| "unhandled errors in a TaskGroup", self._exceptions
|
||||
| ) from None
|
||||
| ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
|
||||
+-+---------------- 1 ----------------
|
||||
| Traceback (most recent call last):
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\_pytest\runner.py", line 344, in from_call
|
||||
| result: TResult | None = func()
|
||||
| ~~~~^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\_pytest\runner.py", line 246, in <lambda>
|
||||
| lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
|
||||
| ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_hooks.py", line 512, in __call__
|
||||
| return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
|
||||
| ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_manager.py", line 120, in _hookexec
|
||||
| return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
|
||||
| ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_callers.py", line 167, in _multicall
|
||||
| raise exception
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_callers.py", line 139, in _multicall
|
||||
| teardown.throw(exception)
|
||||
| ~~~~~~~~~~~~~~^^^^^^^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\_pytest\logging.py", line 850, in pytest_runtest_call
|
||||
| yield
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_callers.py", line 139, in _multicall
|
||||
| teardown.throw(exception)
|
||||
| ~~~~~~~~~~~~~~^^^^^^^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\_pytest\capture.py", line 900, in pytest_runtest_call
|
||||
| return (yield)
|
||||
| ^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_callers.py", line 139, in _multicall
|
||||
| teardown.throw(exception)
|
||||
| ~~~~~~~~~~~~~~^^^^^^^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\_pytest\skipping.py", line 263, in pytest_runtest_call
|
||||
| return (yield)
|
||||
| ^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_callers.py", line 121, in _multicall
|
||||
| res = hook_impl.function(*args)
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\_pytest\runner.py", line 178, in pytest_runtest_call
|
||||
| item.runtest()
|
||||
| ~~~~~~~~~~~~^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\_pytest\python.py", line 1671, in runtest
|
||||
| self.ihook.pytest_pyfunc_call(pyfuncitem=self)
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_hooks.py", line 512, in __call__
|
||||
| return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
|
||||
| ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_manager.py", line 120, in _hookexec
|
||||
| return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
|
||||
| ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_callers.py", line 167, in _multicall
|
||||
| raise exception
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\pluggy\_callers.py", line 121, in _multicall
|
||||
| res = hook_impl.function(*args)
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\_pytest\python.py", line 157, in pytest_pyfunc_call
|
||||
| result = testfunction(**testargs)
|
||||
| File "<仓库根目录>\核桃派软件源代码\tests\test_media_conversion.py", line 347, in test_media_settings_api_accepts_outside_centers_but_rejects_an_empty_view
|
||||
| accepted = client.put(
|
||||
| "/api/media-imports/" + job_id + "/settings",
|
||||
| json={"center_x": -31 / 64, "center_y": -31 / 32},
|
||||
| )
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py", line 583, in put
|
||||
| return super().put(
|
||||
| ~~~~~~~~~~~^
|
||||
| url,
|
||||
| ^^^^
|
||||
| ...<10 lines>...
|
||||
| extensions=extensions,
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
| )
|
||||
| ^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 1181, in put
|
||||
| return self.request(
|
||||
| ~~~~~~~~~~~~^
|
||||
| "PUT",
|
||||
| ^^^^^^
|
||||
| ...<11 lines>...
|
||||
| extensions=extensions,
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
| )
|
||||
| ^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py", line 451, in request
|
||||
| return super().request(
|
||||
| ~~~~~~~~~~~~~~~^
|
||||
| method,
|
||||
| ^^^^^^^
|
||||
| ...<11 lines>...
|
||||
| extensions=extensions,
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
| )
|
||||
| ^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 825, in request
|
||||
| return self.send(request, auth=auth, follow_redirects=follow_redirects)
|
||||
| ~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 914, in send
|
||||
| response = self._send_handling_auth(
|
||||
| request,
|
||||
| ...<2 lines>...
|
||||
| history=[],
|
||||
| )
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 942, in _send_handling_auth
|
||||
| response = self._send_handling_redirects(
|
||||
| request,
|
||||
| follow_redirects=follow_redirects,
|
||||
| history=history,
|
||||
| )
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 979, in _send_handling_redirects
|
||||
| response = self._send_single_request(request)
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 1014, in _send_single_request
|
||||
| response = transport.handle_request(request)
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py", line 354, in handle_request
|
||||
| raise exc
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py", line 351, in handle_request
|
||||
| portal.call(self.app, scope, receive, send)
|
||||
| ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\from_thread.py", line 338, in call
|
||||
| return cast(T_Retval, self.start_task_soon(func, *args).result())
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
|
||||
| File "<开发机用户目录>\AppData\Local\Programs\Python\Python314\Lib\concurrent\futures\_base.py", line 450, in result
|
||||
| return self.__get_result()
|
||||
| ~~~~~~~~~~~~~~~~~^^
|
||||
| File "<开发机用户目录>\AppData\Local\Programs\Python\Python314\Lib\concurrent\futures\_base.py", line 395, in __get_result
|
||||
| raise self._exception
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\from_thread.py", line 263, in _call_func
|
||||
| retval = await retval_or_awaitable
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py", line 1054, in __call__
|
||||
| await super().__call__(scope, receive, send)
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\applications.py", line 113, in __call__
|
||||
| await self.middleware_stack(scope, receive, send)
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\errors.py", line 186, in __call__
|
||||
| raise exc
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\errors.py", line 164, in __call__
|
||||
| await self.app(scope, receive, _send)
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py", line 182, in __call__
|
||||
| with recv_stream, send_stream, collapse_excgroups():
|
||||
| ~~~~~~~~~~~~~~~~~~^^
|
||||
| File "<开发机用户目录>\AppData\Local\Programs\Python\Python314\Lib\contextlib.py", line 162, in __exit__
|
||||
| self.gen.throw(value)
|
||||
| ~~~~~~~~~~~~~~^^^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_utils.py", line 85, in collapse_excgroups
|
||||
| raise exc
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py", line 184, in __call__
|
||||
| response = await self.dispatch_func(request, call_next)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| File "<仓库根目录>\核桃派软件源代码\app\main.py", line 760, in cache_policy
|
||||
| response = await call_next(request)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py", line 159, in call_next
|
||||
| raise app_exc
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py", line 144, in coro
|
||||
| await self.app(scope, receive_or_disconnect, send_no_error)
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\exceptions.py", line 63, in __call__
|
||||
| await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
|
||||
| raise exc
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
|
||||
| await app(scope, receive, sender)
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 716, in __call__
|
||||
| await self.middleware_stack(scope, receive, send)
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 736, in app
|
||||
| await route.handle(scope, receive, send)
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 290, in handle
|
||||
| await self.app(scope, receive, send)
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 78, in app
|
||||
| await wrap_app_handling_exceptions(app, request)(scope, receive, send)
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
|
||||
| raise exc
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
|
||||
| await app(scope, receive, sender)
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 75, in app
|
||||
| response = await f(request)
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py", line 302, in app
|
||||
| raw_response = await run_endpoint_function(
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| ...<3 lines>...
|
||||
| )
|
||||
| ^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py", line 215, in run_endpoint_function
|
||||
| return await run_in_threadpool(dependant.call, **values)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\concurrency.py", line 38, in run_in_threadpool
|
||||
| return await anyio.to_thread.run_sync(func)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\to_thread.py", line 65, in run_sync
|
||||
| return await get_async_backend().run_sync_in_worker_thread(
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| func, args, abandon_on_cancel=abandon_on_cancel, limiter=limiter
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| )
|
||||
| ^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\_backends\_asyncio.py", line 2641, in run_sync_in_worker_thread
|
||||
| return await future
|
||||
| ^^^^^^^^^^^^
|
||||
| File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\_backends\_asyncio.py", line 1033, in run
|
||||
| result = context.run(func, *args)
|
||||
| File "<仓库根目录>\核桃派软件源代码\app\main.py", line 1527, in update_media_settings
|
||||
| return media_imports.update_settings(
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
|
||||
| job_id, request.model_dump(exclude_unset=True, exclude_none=True),
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| )
|
||||
| ^
|
||||
| File "<仓库根目录>\核桃派软件源代码\app\media\manager.py", line 463, in update_settings
|
||||
| self._write(record)
|
||||
| ~~~~~~~~~~~^^^^^^^^
|
||||
| File "<仓库根目录>\核桃派软件源代码\app\media\manager.py", line 137, in _write
|
||||
| atomic_write_bytes(self._path(record["id"]), payload)
|
||||
| ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| File "<仓库根目录>\核桃派软件源代码\app\persistence.py", line 14, in atomic_write_bytes
|
||||
| atomic_write_many_bytes(((Path(path), content),))
|
||||
| ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| File "<仓库根目录>\核桃派软件源代码\app\persistence.py", line 41, in atomic_write_many_bytes
|
||||
| os.replace(temporaries[target], target)
|
||||
| ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| PermissionError: [WinError 5] 拒绝访问。: 'C:\\Users\\<开发机用户名>\\Documents\\wenjian\\1.work\\奇妙小屏幕控制器-核桃派\\测试相关资料\\如何测试\\本机测试环境\\work\\pytest\\test_media_settings_api_accept0\\data\\media-import\\jobs\\9905d4cf-ffe2-4270-91a2-8fd6579b252a\\.job.json.45cf7fdfecf34a80a4164eb8f5171514.tmp' -> 'C:\\Users\\<开发机用户名>\\Documents\\wenjian\\1.work\\奇妙小屏幕控制器-核桃派\\测试相关资料\\如何测试\\本机测试环境\\work\\pytest\\test_media_settings_api_accept0\\data\\media-import\\jobs\\9905d4cf-ffe2-4270-91a2-8fd6579b252a\\job.json'
|
||||
+------------------------------------
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "<仓库根目录>\核桃派软件源代码\tests\test_media_conversion.py", line 347, in test_media_settings_api_accepts_outside_centers_but_rejects_an_empty_view
|
||||
accepted = client.put(
|
||||
"/api/media-imports/" + job_id + "/settings",
|
||||
json={"center_x": -31 / 64, "center_y": -31 / 32},
|
||||
)
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py", line 583, in put
|
||||
return super().put(
|
||||
~~~~~~~~~~~^
|
||||
url,
|
||||
^^^^
|
||||
...<10 lines>...
|
||||
extensions=extensions,
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
)
|
||||
^
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 1181, in put
|
||||
return self.request(
|
||||
~~~~~~~~~~~~^
|
||||
"PUT",
|
||||
^^^^^^
|
||||
...<11 lines>...
|
||||
extensions=extensions,
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
)
|
||||
^
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py", line 451, in request
|
||||
return super().request(
|
||||
~~~~~~~~~~~~~~~^
|
||||
method,
|
||||
^^^^^^^
|
||||
...<11 lines>...
|
||||
extensions=extensions,
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
)
|
||||
^
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 825, in request
|
||||
return self.send(request, auth=auth, follow_redirects=follow_redirects)
|
||||
~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 914, in send
|
||||
response = self._send_handling_auth(
|
||||
request,
|
||||
...<2 lines>...
|
||||
history=[],
|
||||
)
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 942, in _send_handling_auth
|
||||
response = self._send_handling_redirects(
|
||||
request,
|
||||
follow_redirects=follow_redirects,
|
||||
history=history,
|
||||
)
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 979, in _send_handling_redirects
|
||||
response = self._send_single_request(request)
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py", line 1014, in _send_single_request
|
||||
response = transport.handle_request(request)
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py", line 354, in handle_request
|
||||
raise exc
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py", line 351, in handle_request
|
||||
portal.call(self.app, scope, receive, send)
|
||||
~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\from_thread.py", line 338, in call
|
||||
return cast(T_Retval, self.start_task_soon(func, *args).result())
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
|
||||
File "<开发机用户目录>\AppData\Local\Programs\Python\Python314\Lib\concurrent\futures\_base.py", line 450, in result
|
||||
return self.__get_result()
|
||||
~~~~~~~~~~~~~~~~~^^
|
||||
File "<开发机用户目录>\AppData\Local\Programs\Python\Python314\Lib\concurrent\futures\_base.py", line 395, in __get_result
|
||||
raise self._exception
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\from_thread.py", line 263, in _call_func
|
||||
retval = await retval_or_awaitable
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py", line 1054, in __call__
|
||||
await super().__call__(scope, receive, send)
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\applications.py", line 113, in __call__
|
||||
await self.middleware_stack(scope, receive, send)
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\errors.py", line 186, in __call__
|
||||
raise exc
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\errors.py", line 164, in __call__
|
||||
await self.app(scope, receive, _send)
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py", line 182, in __call__
|
||||
with recv_stream, send_stream, collapse_excgroups():
|
||||
~~~~~~~~~~~~~~~~~~^^
|
||||
File "<开发机用户目录>\AppData\Local\Programs\Python\Python314\Lib\contextlib.py", line 162, in __exit__
|
||||
self.gen.throw(value)
|
||||
~~~~~~~~~~~~~~^^^^^^^
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_utils.py", line 85, in collapse_excgroups
|
||||
raise exc
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py", line 184, in __call__
|
||||
response = await self.dispatch_func(request, call_next)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "<仓库根目录>\核桃派软件源代码\app\main.py", line 760, in cache_policy
|
||||
response = await call_next(request)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py", line 159, in call_next
|
||||
raise app_exc
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py", line 144, in coro
|
||||
await self.app(scope, receive_or_disconnect, send_no_error)
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\exceptions.py", line 63, in __call__
|
||||
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
|
||||
raise exc
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
|
||||
await app(scope, receive, sender)
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 716, in __call__
|
||||
await self.middleware_stack(scope, receive, send)
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 736, in app
|
||||
await route.handle(scope, receive, send)
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 290, in handle
|
||||
await self.app(scope, receive, send)
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 78, in app
|
||||
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
|
||||
raise exc
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
|
||||
await app(scope, receive, sender)
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py", line 75, in app
|
||||
response = await f(request)
|
||||
^^^^^^^^^^^^^^^^
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py", line 302, in app
|
||||
raw_response = await run_endpoint_function(
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
...<3 lines>...
|
||||
)
|
||||
^
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py", line 215, in run_endpoint_function
|
||||
return await run_in_threadpool(dependant.call, **values)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\concurrency.py", line 38, in run_in_threadpool
|
||||
return await anyio.to_thread.run_sync(func)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\to_thread.py", line 65, in run_sync
|
||||
return await get_async_backend().run_sync_in_worker_thread(
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
func, args, abandon_on_cancel=abandon_on_cancel, limiter=limiter
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
)
|
||||
^
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\_backends\_asyncio.py", line 2641, in run_sync_in_worker_thread
|
||||
return await future
|
||||
^^^^^^^^^^^^
|
||||
File "<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\_backends\_asyncio.py", line 1033, in run
|
||||
result = context.run(func, *args)
|
||||
File "<仓库根目录>\核桃派软件源代码\app\main.py", line 1527, in update_media_settings
|
||||
return media_imports.update_settings(
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
|
||||
job_id, request.model_dump(exclude_unset=True, exclude_none=True),
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
)
|
||||
^
|
||||
File "<仓库根目录>\核桃派软件源代码\app\media\manager.py", line 463, in update_settings
|
||||
self._write(record)
|
||||
~~~~~~~~~~~^^^^^^^^
|
||||
File "<仓库根目录>\核桃派软件源代码\app\media\manager.py", line 137, in _write
|
||||
atomic_write_bytes(self._path(record["id"]), payload)
|
||||
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "<仓库根目录>\核桃派软件源代码\app\persistence.py", line 14, in atomic_write_bytes
|
||||
atomic_write_many_bytes(((Path(path), content),))
|
||||
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "<仓库根目录>\核桃派软件源代码\app\persistence.py", line 41, in atomic_write_many_bytes
|
||||
os.replace(temporaries[target], target)
|
||||
~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
PermissionError: [WinError 5] 拒绝访问。: 'C:\\Users\\<开发机用户名>\\Documents\\wenjian\\1.work\\奇妙小屏幕控制器-核桃派\\测试相关资料\\如何测试\\本机测试环境\\work\\pytest\\test_media_settings_api_accept0\\data\\media-import\\jobs\\9905d4cf-ffe2-4270-91a2-8fd6579b252a\\.job.json.45cf7fdfecf34a80a4164eb8f5171514.tmp' -> 'C:\\Users\\<开发机用户名>\\Documents\\wenjian\\1.work\\奇妙小屏幕控制器-核桃派\\测试相关资料\\如何测试\\本机测试环境\\work\\pytest\\test_media_settings_api_accept0\\data\\media-import\\jobs\\9905d4cf-ffe2-4270-91a2-8fd6579b252a\\job.json'
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
tmp_path = WindowsPath('<仓库根目录>/测试相关资料/如何测试/本机测试环境/work/pytest/test_media_settings_api_accept0')
|
||||
|
||||
def test_media_settings_api_accepts_outside_centers_but_rejects_an_empty_view(tmp_path):
|
||||
app = create_app(project_root=tmp_path, driver_kind="mock")
|
||||
payload = png_bytes(Image.new("RGB", (2, 1), "white"))
|
||||
with TestClient(app) as client:
|
||||
uploaded = client.post(
|
||||
"/api/media-imports?filename=a.png&name=自由取景", content=payload,
|
||||
headers={"Content-Type": "application/octet-stream", "Content-Length": str(len(payload))},
|
||||
)
|
||||
job_id = uploaded.json()["id"]
|
||||
wait_for(client, job_id, "awaiting_settings")
|
||||
> accepted = client.put(
|
||||
"/api/media-imports/" + job_id + "/settings",
|
||||
json={"center_x": -31 / 64, "center_y": -31 / 32},
|
||||
)
|
||||
|
||||
tests\test_media_conversion.py:347:
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py:583: in put
|
||||
return super().put(
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py:1181: in put
|
||||
return self.request(
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py:451: in request
|
||||
return super().request(
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py:825: in request
|
||||
return self.send(request, auth=auth, follow_redirects=follow_redirects)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py:914: in send
|
||||
response = self._send_handling_auth(
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py:942: in _send_handling_auth
|
||||
response = self._send_handling_redirects(
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py:979: in _send_handling_redirects
|
||||
response = self._send_single_request(request)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\httpx\_client.py:1014: in _send_single_request
|
||||
response = transport.handle_request(request)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py:354: in handle_request
|
||||
raise exc
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\testclient.py:351: in handle_request
|
||||
portal.call(self.app, scope, receive, send)
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\from_thread.py:338: in call
|
||||
return cast(T_Retval, self.start_task_soon(func, *args).result())
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
..\..\..\..\..\AppData\Local\Programs\Python\Python314\Lib\concurrent\futures\_base.py:450: in result
|
||||
return self.__get_result()
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
..\..\..\..\..\AppData\Local\Programs\Python\Python314\Lib\concurrent\futures\_base.py:395: in __get_result
|
||||
raise self._exception
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\from_thread.py:263: in _call_func
|
||||
retval = await retval_or_awaitable
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:1054: in __call__
|
||||
await super().__call__(scope, receive, send)
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\applications.py:113: in __call__
|
||||
await self.middleware_stack(scope, receive, send)
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\errors.py:186: in __call__
|
||||
raise exc
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\errors.py:164: in __call__
|
||||
await self.app(scope, receive, _send)
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py:182: in __call__
|
||||
with recv_stream, send_stream, collapse_excgroups():
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
..\..\..\..\..\AppData\Local\Programs\Python\Python314\Lib\contextlib.py:162: in __exit__
|
||||
self.gen.throw(value)
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_utils.py:85: in collapse_excgroups
|
||||
raise exc
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py:184: in __call__
|
||||
response = await self.dispatch_func(request, call_next)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
app\main.py:760: in cache_policy
|
||||
response = await call_next(request)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py:159: in call_next
|
||||
raise app_exc
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\base.py:144: in coro
|
||||
await self.app(scope, receive_or_disconnect, send_no_error)
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\middleware\exceptions.py:63: in __call__
|
||||
await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py:53: in wrapped_app
|
||||
raise exc
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py:42: in wrapped_app
|
||||
await app(scope, receive, sender)
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py:716: in __call__
|
||||
await self.middleware_stack(scope, receive, send)
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py:736: in app
|
||||
await route.handle(scope, receive, send)
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py:290: in handle
|
||||
await self.app(scope, receive, send)
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py:78: in app
|
||||
await wrap_app_handling_exceptions(app, request)(scope, receive, send)
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py:53: in wrapped_app
|
||||
raise exc
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\_exception_handler.py:42: in wrapped_app
|
||||
await app(scope, receive, sender)
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\routing.py:75: in app
|
||||
response = await f(request)
|
||||
^^^^^^^^^^^^^^^^
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:302: in app
|
||||
raw_response = await run_endpoint_function(
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:215: in run_endpoint_function
|
||||
return await run_in_threadpool(dependant.call, **values)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\starlette\concurrency.py:38: in run_in_threadpool
|
||||
return await anyio.to_thread.run_sync(func)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\to_thread.py:65: in run_sync
|
||||
return await get_async_backend().run_sync_in_worker_thread(
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\_backends\_asyncio.py:2641: in run_sync_in_worker_thread
|
||||
return await future
|
||||
^^^^^^^^^^^^
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\anyio\_backends\_asyncio.py:1033: in run
|
||||
result = context.run(func, *args)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
app\main.py:1527: in update_media_settings
|
||||
return media_imports.update_settings(
|
||||
app\media\manager.py:463: in update_settings
|
||||
self._write(record)
|
||||
app\media\manager.py:137: in _write
|
||||
atomic_write_bytes(self._path(record["id"]), payload)
|
||||
app\persistence.py:14: in atomic_write_bytes
|
||||
atomic_write_many_bytes(((Path(path), content),))
|
||||
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
|
||||
|
||||
writes = ((WindowsPath('<仓库根目录>/测试相关资料/如何测试/本机测试环境/work/pytest/test_media_setting... },\n "source_size": 72,\n "state": "awaiting_settings",\n "updated_at": "2026-10-09T07:13:23.922089+00:00"\n}\n'),)
|
||||
|
||||
def atomic_write_many_bytes(writes: Iterable[tuple[Path, bytes]]) -> None:
|
||||
"""Durably replace one or more files and roll back a failed transaction."""
|
||||
entries = [(Path(path), bytes(content)) for path, content in writes]
|
||||
if not entries:
|
||||
return
|
||||
targets = [path for path, _content in entries]
|
||||
if len(set(targets)) != len(targets):
|
||||
raise ValueError("atomic write transaction contains duplicate paths")
|
||||
|
||||
originals: dict[Path, bytes | None] = {}
|
||||
temporaries: dict[Path, Path] = {}
|
||||
replaced: list[Path] = []
|
||||
parents = sorted({target.parent for target in targets}, key=str)
|
||||
|
||||
try:
|
||||
for target, _content in entries:
|
||||
target.parent.mkdir(parents=True, exist_ok=True)
|
||||
originals[target] = target.read_bytes() if target.exists() else None
|
||||
for target, content in entries:
|
||||
temporary = _write_temporary(target, content)
|
||||
temporaries[target] = temporary
|
||||
for parent in parents:
|
||||
_fsync_directory(parent)
|
||||
for target, _content in entries:
|
||||
> os.replace(temporaries[target], target)
|
||||
E PermissionError: [WinError 5] 拒绝访问。: 'C:\\Users\\<开发机用户名>\\Documents\\wenjian\\1.work\\奇妙小屏幕控制器-核桃派\\测试相关资料\\如何测试\\本机测试环境\\work\\pytest\\test_media_settings_api_accept0\\data\\media-import\\jobs\\9905d4cf-ffe2-4270-91a2-8fd6579b252a\\.job.json.45cf7fdfecf34a80a4164eb8f5171514.tmp' -> 'C:\\Users\\<开发机用户名>\\Documents\\wenjian\\1.work\\奇妙小屏幕控制器-核桃派\\测试相关资料\\如何测试\\本机测试环境\\work\\pytest\\test_media_settings_api_accept0\\data\\media-import\\jobs\\9905d4cf-ffe2-4270-91a2-8fd6579b252a\\job.json'
|
||||
|
||||
app\persistence.py:41: PermissionError
|
||||
------------------------------ Captured log call ------------------------------
|
||||
WARNING app.power.voltage:voltage.py:601 Screen voltage sensor status=disconnected error_code=unsupported_platform
|
||||
WARNING app.monitoring.resources:resources.py:249 System resource monitor is unavailable: proc_read_error
|
||||
============================== warnings summary ===============================
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15
|
||||
@no_type_check_decorator
|
||||
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: 10 warnings
|
||||
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15
|
||||
@no_type_check_decorator
|
||||
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: 83 warnings
|
||||
tests/test_animations.py: 913 warnings
|
||||
tests/test_api.py: 2075 warnings
|
||||
tests/test_fonts.py: 249 warnings
|
||||
tests/test_frp.py: 332 warnings
|
||||
tests/test_library_order.py: 332 warnings
|
||||
tests/test_media_conversion.py: 830 warnings
|
||||
tests/test_mobile_control.py: 1162 warnings
|
||||
tests/test_ota.py: 249 warnings
|
||||
tests/test_performance_mode.py: 83 warnings
|
||||
tests/test_scene_layers.py: 166 warnings
|
||||
tests/test_templates.py: 664 warnings
|
||||
tests/test_ui_copy_editor.py: 599 warnings
|
||||
tests/test_wifi.py: 249 warnings
|
||||
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead
|
||||
is_coroutine = asyncio.iscoroutinefunction(dependant.call)
|
||||
|
||||
app\main.py:2049: 1 warning
|
||||
tests/test_animations.py: 11 warnings
|
||||
tests/test_api.py: 25 warnings
|
||||
tests/test_fonts.py: 3 warnings
|
||||
tests/test_frp.py: 4 warnings
|
||||
tests/test_library_order.py: 4 warnings
|
||||
tests/test_media_conversion.py: 10 warnings
|
||||
tests/test_mobile_control.py: 14 warnings
|
||||
tests/test_ota.py: 3 warnings
|
||||
tests/test_performance_mode.py: 1 warning
|
||||
tests/test_scene_layers.py: 2 warnings
|
||||
tests/test_templates.py: 8 warnings
|
||||
tests/test_ui_copy_editor.py: 7 warnings
|
||||
tests/test_wifi.py: 3 warnings
|
||||
<仓库根目录>\核桃派软件源代码\app\main.py:2049: DeprecationWarning:
|
||||
on_event is deprecated, use lifespan event handlers instead.
|
||||
|
||||
Read more about it in the
|
||||
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
|
||||
|
||||
@app.on_event("startup")
|
||||
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: 2 warnings
|
||||
tests/test_animations.py: 22 warnings
|
||||
tests/test_api.py: 50 warnings
|
||||
tests/test_fonts.py: 6 warnings
|
||||
tests/test_frp.py: 8 warnings
|
||||
tests/test_library_order.py: 8 warnings
|
||||
tests/test_media_conversion.py: 20 warnings
|
||||
tests/test_mobile_control.py: 28 warnings
|
||||
tests/test_ota.py: 6 warnings
|
||||
tests/test_performance_mode.py: 2 warnings
|
||||
tests/test_scene_layers.py: 4 warnings
|
||||
tests/test_templates.py: 16 warnings
|
||||
tests/test_ui_copy_editor.py: 14 warnings
|
||||
tests/test_wifi.py: 6 warnings
|
||||
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: DeprecationWarning:
|
||||
on_event is deprecated, use lifespan event handlers instead.
|
||||
|
||||
Read more about it in the
|
||||
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
|
||||
|
||||
return self.router.on_event(event_type)
|
||||
|
||||
app\main.py:2079: 1 warning
|
||||
tests/test_animations.py: 11 warnings
|
||||
tests/test_api.py: 25 warnings
|
||||
tests/test_fonts.py: 3 warnings
|
||||
tests/test_frp.py: 4 warnings
|
||||
tests/test_library_order.py: 4 warnings
|
||||
tests/test_media_conversion.py: 10 warnings
|
||||
tests/test_mobile_control.py: 14 warnings
|
||||
tests/test_ota.py: 3 warnings
|
||||
tests/test_performance_mode.py: 1 warning
|
||||
tests/test_scene_layers.py: 2 warnings
|
||||
tests/test_templates.py: 8 warnings
|
||||
tests/test_ui_copy_editor.py: 7 warnings
|
||||
tests/test_wifi.py: 3 warnings
|
||||
<仓库根目录>\核桃派软件源代码\app\main.py:2079: DeprecationWarning:
|
||||
on_event is deprecated, use lifespan event handlers instead.
|
||||
|
||||
Read more about it in the
|
||||
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
|
||||
|
||||
@app.on_event("shutdown")
|
||||
|
||||
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
|
||||
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
|
||||
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
|
||||
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
|
||||
<仓库根目录>\核桃派软件源代码\tests\test_media_conversion.py:134: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead.
|
||||
assert sum(pixel[0] > 240 for pixel in output.getdata()) == 1
|
||||
|
||||
tests/test_templates.py::test_template_crud_copy_persistence_and_thumbnail_cleanup
|
||||
<仓库根目录>\核桃派软件源代码\tests\test_templates.py:165: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead.
|
||||
assert len(set(image.getdata())) > 1
|
||||
|
||||
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
|
||||
=========================== short test summary info ===========================
|
||||
FAILED tests/test_media_conversion.py::test_media_settings_api_accepts_outside_centers_but_rejects_an_empty_view
|
||||
1 failed, 511 passed, 9 skipped, 8390 warnings in 133.37s (0:02:13)
|
||||
本机测试工具失败:Command '['C:\\Users\\<开发机用户名>\\Documents\\wenjian\\1.work\\奇妙小屏幕控制器-核桃派\\测试相关资料\\如何测试\\本机测试环境\\.venv\\Scripts\\python.exe', '-m', 'pytest', '-q', '-p', 'no:cacheprovider', '--basetemp=C:\\Users\\<开发机用户名>\\Documents\\wenjian\\1.work\\奇妙小屏幕控制器-核桃派\\测试相关资料\\如何测试\\本机测试环境\\work\\pytest']' returned non-zero exit status 1.
|
||||
@@ -0,0 +1,248 @@
|
||||
requirements 未变化,跳过依赖安装。
|
||||
> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe -m pip check
|
||||
No broken requirements found.
|
||||
已清理:<仓库根目录>\测试相关资料\如何测试\本机测试环境\work\pytest
|
||||
> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe -m pytest -q -p no:cacheprovider --basetemp=<仓库根目录>\测试相关资料\如何测试\本机测试环境\work\pytest
|
||||
........................................................................ [ 13%]
|
||||
........................................................................ [ 27%]
|
||||
........................................................................ [ 41%]
|
||||
....................................sssssss.......s..................... [ 55%]
|
||||
........................................................................ [ 68%]
|
||||
.......s................................................................ [ 82%]
|
||||
........................................................................ [ 96%]
|
||||
.................. [100%]
|
||||
============================== warnings summary ===============================
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15
|
||||
@no_type_check_decorator
|
||||
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: 10 warnings
|
||||
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15
|
||||
@no_type_check_decorator
|
||||
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: 83 warnings
|
||||
tests/test_animations.py: 913 warnings
|
||||
tests/test_api.py: 2075 warnings
|
||||
tests/test_fonts.py: 249 warnings
|
||||
tests/test_frp.py: 332 warnings
|
||||
tests/test_library_order.py: 332 warnings
|
||||
tests/test_media_conversion.py: 830 warnings
|
||||
tests/test_mobile_control.py: 1162 warnings
|
||||
tests/test_ota.py: 249 warnings
|
||||
tests/test_performance_mode.py: 83 warnings
|
||||
tests/test_scene_layers.py: 166 warnings
|
||||
tests/test_templates.py: 664 warnings
|
||||
tests/test_ui_copy_editor.py: 599 warnings
|
||||
tests/test_wifi.py: 249 warnings
|
||||
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead
|
||||
is_coroutine = asyncio.iscoroutinefunction(dependant.call)
|
||||
|
||||
app\main.py:2049: 1 warning
|
||||
tests/test_animations.py: 11 warnings
|
||||
tests/test_api.py: 25 warnings
|
||||
tests/test_fonts.py: 3 warnings
|
||||
tests/test_frp.py: 4 warnings
|
||||
tests/test_library_order.py: 4 warnings
|
||||
tests/test_media_conversion.py: 10 warnings
|
||||
tests/test_mobile_control.py: 14 warnings
|
||||
tests/test_ota.py: 3 warnings
|
||||
tests/test_performance_mode.py: 1 warning
|
||||
tests/test_scene_layers.py: 2 warnings
|
||||
tests/test_templates.py: 8 warnings
|
||||
tests/test_ui_copy_editor.py: 7 warnings
|
||||
tests/test_wifi.py: 3 warnings
|
||||
<仓库根目录>\核桃派软件源代码\app\main.py:2049: DeprecationWarning:
|
||||
on_event is deprecated, use lifespan event handlers instead.
|
||||
|
||||
Read more about it in the
|
||||
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
|
||||
|
||||
@app.on_event("startup")
|
||||
|
||||
..\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: 2 warnings
|
||||
tests/test_animations.py: 22 warnings
|
||||
tests/test_api.py: 50 warnings
|
||||
tests/test_fonts.py: 6 warnings
|
||||
tests/test_frp.py: 8 warnings
|
||||
tests/test_library_order.py: 8 warnings
|
||||
tests/test_media_conversion.py: 20 warnings
|
||||
tests/test_mobile_control.py: 28 warnings
|
||||
tests/test_ota.py: 6 warnings
|
||||
tests/test_performance_mode.py: 2 warnings
|
||||
tests/test_scene_layers.py: 4 warnings
|
||||
tests/test_templates.py: 16 warnings
|
||||
tests/test_ui_copy_editor.py: 14 warnings
|
||||
tests/test_wifi.py: 6 warnings
|
||||
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: DeprecationWarning:
|
||||
on_event is deprecated, use lifespan event handlers instead.
|
||||
|
||||
Read more about it in the
|
||||
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
|
||||
|
||||
return self.router.on_event(event_type)
|
||||
|
||||
app\main.py:2079: 1 warning
|
||||
tests/test_animations.py: 11 warnings
|
||||
tests/test_api.py: 25 warnings
|
||||
tests/test_fonts.py: 3 warnings
|
||||
tests/test_frp.py: 4 warnings
|
||||
tests/test_library_order.py: 4 warnings
|
||||
tests/test_media_conversion.py: 10 warnings
|
||||
tests/test_mobile_control.py: 14 warnings
|
||||
tests/test_ota.py: 3 warnings
|
||||
tests/test_performance_mode.py: 1 warning
|
||||
tests/test_scene_layers.py: 2 warnings
|
||||
tests/test_templates.py: 8 warnings
|
||||
tests/test_ui_copy_editor.py: 7 warnings
|
||||
tests/test_wifi.py: 3 warnings
|
||||
<仓库根目录>\核桃派软件源代码\app\main.py:2079: DeprecationWarning:
|
||||
on_event is deprecated, use lifespan event handlers instead.
|
||||
|
||||
Read more about it in the
|
||||
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
|
||||
|
||||
@app.on_event("shutdown")
|
||||
|
||||
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
|
||||
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
|
||||
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
|
||||
tests/test_media_conversion.py::test_free_crop_can_leave_only_one_source_pixel_visible_at_each_corner
|
||||
<仓库根目录>\核桃派软件源代码\tests\test_media_conversion.py:134: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead.
|
||||
assert sum(pixel[0] > 240 for pixel in output.getdata()) == 1
|
||||
|
||||
tests/test_templates.py::test_template_crud_copy_persistence_and_thumbnail_cleanup
|
||||
<仓库根目录>\核桃派软件源代码\tests\test_templates.py:165: DeprecationWarning: Image.Image.getdata is deprecated and will be removed in Pillow 14 (2027-10-15). Use get_flattened_data instead.
|
||||
assert len(set(image.getdata())) > 1
|
||||
|
||||
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
|
||||
513 passed, 9 skipped, 8390 warnings in 80.59s (0:01:20)
|
||||
> "C:\Program Files\nodejs\node.EXE" --test tests/test_animation_ui.mjs tests/test_canvas_tools.mjs tests/test_color_math.mjs tests/test_current_display_playback_ui.mjs tests/test_device_ui.mjs tests/test_font_picker.mjs tests/test_frp_ui.mjs tests/test_interaction_feedback.mjs tests/test_scene_model.mjs tests/test_scene_layers.mjs tests/test_settings_ui.mjs tests/test_template_management_ui.mjs tests/test_ui_copy_editor.mjs tests/test_wifi_ui.mjs tests/test_workspace_order_ui.mjs
|
||||
✔ derives automatic frame names from current animation name and position (0.9515ms)
|
||||
✔ keeps custom frame names and restores automatic names when cleared (0.1245ms)
|
||||
✔ builds non-repeating animation edit context names (0.261ms)
|
||||
✔ selects saved animation preview frames by ordered durations (1.2698ms)
|
||||
✔ loads every preview frame through revision-checked pagination (0.9708ms)
|
||||
✔ validates configurable animation preview concurrency (0.3327ms)
|
||||
✔ rejects mixed revisions instead of showing a partial animation (0.5586ms)
|
||||
✔ validates frame duration only when explicitly called (0.4824ms)
|
||||
✔ moves selected frames as one ordered group (0.2395ms)
|
||||
✔ protects an eight pixel ring around interactive drag controls (0.2648ms)
|
||||
✔ reorders mixed library keys without mutating the source list (0.1429ms)
|
||||
✔ restores drag eligibility after protected pointer cancellation and drag end (0.4837ms)
|
||||
✔ animation workspace exposes two previews and the simplified control order (7.7914ms)
|
||||
✔ normal and pixel modes expose independent ranges and presets (1.4623ms)
|
||||
✔ pixel stamps are exact squares from 1x1 through 4x4 (0.2562ms)
|
||||
✔ pixel stamps clip at every canvas edge (0.2164ms)
|
||||
✔ normal circle geometry remains unchanged (0.1049ms)
|
||||
✔ line interpolation includes endpoints without coordinate gaps (0.2417ms)
|
||||
✔ older tools migrate while v3 restores the coordinate guide choice (0.2446ms)
|
||||
✔ coordinate guide spacing adapts to the transformed logical pixel size (0.1592ms)
|
||||
✔ coordinate guide ticks preserve logical values through zoom and pan (0.2081ms)
|
||||
✔ pixel mode markup and grid stay accessible and non-interactive (7.7742ms)
|
||||
✔ pixel undo history stores changed snapshots, caps entries, and clears (0.4387ms)
|
||||
✔ canvas view clamps scale and keeps a visible section in the viewport (0.188ms)
|
||||
✔ zooming around an anchor preserves its logical position (0.13ms)
|
||||
✔ floating editor button stays inside its safe viewport bounds (0.0947ms)
|
||||
✔ canvas editor markup, guarded input, and checkpoint events stay wired (3.4305ms)
|
||||
✔ normalizes and converts hexadecimal colors (1.9821ms)
|
||||
✔ converts RGB and HSV boundaries (0.5703ms)
|
||||
✔ round trips representative colors within 8-bit rounding (0.5308ms)
|
||||
✔ recent colors deduplicate, normalize, and evict the oldest (0.5626ms)
|
||||
✔ formats and projects looping playback without moving paused content (1.1975ms)
|
||||
✔ seek dispatcher keeps one request in flight and flushes the newest position (4.4609ms)
|
||||
✔ topbar current display dialog exposes static close and animation controls (6.2645ms)
|
||||
✔ device workspace exposes the compact immediate pure-color test flow (9.8628ms)
|
||||
✔ font catalog normalization, grouping, and search are stable (1.5036ms)
|
||||
✔ font picker implements commit-only searchable combobox keyboard behavior (5.6835ms)
|
||||
✔ settings places unrestricted FRP maintenance at the bottom (6.9486ms)
|
||||
✔ FRP editor uses raw server storage and official validation errors (2.167ms)
|
||||
✔ network diagnostics renders layered evidence (2.1028ms)
|
||||
✔ unavailable controls never masquerade as indefinite loading (10.083ms)
|
||||
✔ action controls do not bypass the shared state module (11.6691ms)
|
||||
✔ HTTP requests time out with a stable user-facing error (22.3421ms)
|
||||
✔ demo library actions stay black, explain restrictions, and preserve copy (3.2743ms)
|
||||
✔ sortable cards protect controls and keep demo cards fixed (2.9684ms)
|
||||
✔ old scene migration rejects unknown fields and duplicate text without filtering (64.7563ms)
|
||||
✔ PNG compression round trips sparse and full brush pixels without DOM (6.196ms)
|
||||
✔ blank and black are distinct; independent backgrounds follow layer order (6.6852ms)
|
||||
✔ disabled background colors stay independent through storage and copy (22.0249ms)
|
||||
✔ extended pixels survive storage but never enter the central output (9.2346ms)
|
||||
✔ move preview does not mutate source; confirmed clipping removes only outside ink (19.7505ms)
|
||||
✔ text clipping follows anchor and scale and is retained after edit/reload/copy (13.7559ms)
|
||||
✔ multiple text groups isolate edits, copies and IDs (1.2854ms)
|
||||
✔ strict v2 storage protects unknown data and the final brush invariant (8.3614ms)
|
||||
✔ creates a fixed 64x64 RGB scene (10.9456ms)
|
||||
✔ serializes pixelRgb as base64 and round trips an independent scene (37.0409ms)
|
||||
✔ moves a valid v1 draft to the stable key before removing exact legacy keys (49.945ms)
|
||||
✔ keeps the v1 draft and all legacy keys when stable-key migration cannot write (24.5337ms)
|
||||
✔ preserves and blocks a future stable draft instead of falling back or writing blank (8.204ms)
|
||||
✔ preserves and blocks a damaged stable draft (0.4319ms)
|
||||
✔ does not discard a damaged higher-priority legacy key during fallback migration (2.5171ms)
|
||||
✔ rejects damaged scene roots while skipping only damaged elements (14.877ms)
|
||||
✔ normalizes text fields and creates a centered lowercase ok element (0.6562ms)
|
||||
✔ migrates the first valid canvas by v3, v2, legacy priority and merges text v1 (21.5273ms)
|
||||
✔ supports independent add, update, and delete operations for multiple text elements (0.9531ms)
|
||||
✔ duplicates with a deep copy, new id, 2px offset, and topmost order (0.6196ms)
|
||||
✔ alpha-composites full RGBA layers in array order without mutating inputs (3.6943ms)
|
||||
✔ settings brightness explains an active temporary display-test override (9.7684ms)
|
||||
✔ settings exposes full OTA upload progress and service recovery polling (8.1602ms)
|
||||
✔ settings automatically opens and safely copies a detailed OTA failure log (8.1723ms)
|
||||
✔ settings exposes a transactional performance-mode switch with the fixed warning (5.1003ms)
|
||||
✔ settings exposes persisted animation preview concurrency below performance mode (4.0705ms)
|
||||
✔ template edit baseline distinguishes clean, dirty, and unbound scenes (3.5809ms)
|
||||
✔ template manager uses a monitor and unified four-row card actions (14.6767ms)
|
||||
✔ animation editing backs up and restores template edit ownership (2.2034ms)
|
||||
✔ special editor exposes the agreed modes and guarded editing flow (14.5121ms)
|
||||
✔ latched WiFi draft state remains dirty until explicitly cleared (4.2347ms)
|
||||
✔ WiFi settings expose independent network and prompt-delay controls (6.8702ms)
|
||||
✔ workspace order resolves saved ids and appends new registrations (1.8016ms)
|
||||
✔ workspace order movement is immutable and respects both boundaries (0.3724ms)
|
||||
✔ drawer exposes one editable list and commits only from the save action (10.7414ms)
|
||||
ℹ tests 81
|
||||
ℹ suites 0
|
||||
ℹ pass 81
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 693.5062
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\animation-thumbnail-preview.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\animation-ui-model.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\app.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\canvas-tools-model.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\color-math.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\color-picker.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\core.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\current-display-playback.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\font-picker.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\interaction-feedback.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\media-crop-geometry.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\media-import-ui-model.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\pixel-png.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\scene-board.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\scene-model-v1.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\scene-model.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\sortable-card.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\template-edit-model.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\ui-copy-runtime.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\vendor\fflate\fflate.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\animations.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\canvas.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\device.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\frp-settings.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\layers.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\media-import.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\settings.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\templates.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\text.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\views\wifi-settings.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\wifi-draft-state.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check <仓库根目录>\核桃派软件源代码\app\static\workspace-order.js
|
||||
> "C:\Program Files\nodejs\node.EXE" --check app/ui_copy_editor/static/editor.js
|
||||
> <仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Scripts\python.exe scripts/build_ui_copy_catalog.py --check
|
||||
ui-copy.json is current
|
||||
本机测试套件通过:all
|
||||
|
After Width: | Height: | Size: 33 KiB |
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"desktop": {
|
||||
"passed": true,
|
||||
"nativeConfirmations": 6,
|
||||
"layers": 3,
|
||||
"errors": []
|
||||
},
|
||||
"narrowMenu": {
|
||||
"x": 74,
|
||||
"y": 394,
|
||||
"width": 224,
|
||||
"height": 438
|
||||
},
|
||||
"touchLayerX": "10"
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
Verified all 37 exact task payload/stage/rollback/test paths absent; user content unchanged.
|
||||
@@ -0,0 +1,2 @@
|
||||
私有凭据文件可用;未输出任何凭据值。
|
||||
Removed exact remote temporary payload: /run/matrix-screen-controller-layers-20261009
|
||||
@@ -0,0 +1,130 @@
|
||||
annotated_types-0.8.0-py3-none-any.whl: OK
|
||||
anyio-4.14.2-py3-none-any.whl: OK
|
||||
certifi-2026.7.22-py3-none-any.whl: OK
|
||||
cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl: OK
|
||||
click-8.4.2-py3-none-any.whl: OK
|
||||
colorama-0.4.6-py2.py3-none-any.whl: OK
|
||||
cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl: OK
|
||||
dbus_next-0.2.3-py3-none-any.whl: OK
|
||||
fastapi-0.116.1-py3-none-any.whl: OK
|
||||
fonttools-4.63.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK
|
||||
h11-0.16.0-py3-none-any.whl: OK
|
||||
httpcore-1.0.9-py3-none-any.whl: OK
|
||||
httptools-0.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK
|
||||
httpx-0.28.1-py3-none-any.whl: OK
|
||||
idna-3.18-py3-none-any.whl: OK
|
||||
iniconfig-2.3.0-py3-none-any.whl: OK
|
||||
packaging-26.3-py3-none-any.whl: OK
|
||||
pillow-12.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl: OK
|
||||
pluggy-1.6.0-py3-none-any.whl: OK
|
||||
pycparser-3.0-py3-none-any.whl: OK
|
||||
pydantic-2.13.4-py3-none-any.whl: OK
|
||||
pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl: OK
|
||||
pygments-2.20.0-py3-none-any.whl: OK
|
||||
pytest-8.4.1-py3-none-any.whl: OK
|
||||
python_dotenv-1.2.2-py3-none-any.whl: OK
|
||||
pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK
|
||||
starlette-0.47.3-py3-none-any.whl: OK
|
||||
typing_extensions-4.16.0-py3-none-any.whl: OK
|
||||
typing_inspection-0.4.2-py3-none-any.whl: OK
|
||||
uvicorn-0.35.0-py3-none-any.whl: OK
|
||||
uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK
|
||||
watchfiles-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl: OK
|
||||
websockets-17.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl: OK
|
||||
Looking in links: /run/[private]-screen-controller-layers-20261009/wheels
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/fastapi-0.116.1-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/uvicorn-0.35.0-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/pillow-12.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/fonttools-4.63.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/dbus_next-0.2.3-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/pytest-8.4.1-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/httpx-0.28.1-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/starlette-0.47.3-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/pydantic-2.13.4-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/typing_extensions-4.16.0-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/click-8.4.2-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/h11-0.16.0-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/httptools-0.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/python_dotenv-1.2.2-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/websockets-17.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/iniconfig-2.3.0-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/packaging-26.3-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/pluggy-1.6.0-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/pygments-2.20.0-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/anyio-4.14.2-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/certifi-2026.7.22-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/httpcore-1.0.9-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/idna-3.18-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/pycparser-3.0-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/annotated_types-0.8.0-py3-none-any.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
|
||||
Processing /run/[private]-screen-controller-layers-20261009/wheels/typing_inspection-0.4.2-py3-none-any.whl
|
||||
Installing collected packages: websockets, uvloop, typing-extensions, pyyaml, python-dotenv, pygments, pycparser, pluggy, pillow, packaging, iniconfig, idna, httptools, h11, fonttools, dbus-next, click, certifi, annotated-types, uvicorn, typing-inspection, pytest, pydantic-core, httpcore, cffi, anyio, watchfiles, starlette, pydantic, httpx, cryptography, fastapi
|
||||
Successfully installed annotated-types-0.8.0 anyio-4.14.2 certifi-2026.7.22 cffi-2.1.1 click-8.4.2 cryptography-46.0.5 dbus-next-0.2.3 fastapi-0.116.1 fonttools-4.63.0 h11-0.16.0 httpcore-1.0.9 httptools-0.8.0 httpx-0.28.1 idna-3.18 iniconfig-2.3.0 packaging-26.3 pillow-12.3.0 pluggy-1.6.0 pycparser-3.0 pydantic-2.13.4 pydantic-core-2.46.4 pygments-2.20.0 pytest-8.4.1 python-dotenv-1.2.2 pyyaml-6.0.3 starlette-0.47.3 typing-extensions-4.16.0 typing-inspection-0.4.2 uvicorn-0.35.0 uvloop-0.22.1 watchfiles-1.2.0 websockets-17.0.1
|
||||
make: Entering directory '/opt/[private]-screen-controller.stage.1.1.3-layers-20261009-ready/app/display/native'
|
||||
rm -f -- libh618_hub75.so hub75_benchmark hub75_native_test hub75_safeoff
|
||||
cc -O3 -std=c11 -Wall -Wextra -Werror -fPIC -pthread -shared h618_hub75.c -o libh618_hub75.so -pthread
|
||||
cc -O3 -std=c11 -Wall -Wextra -Werror -fPIC -pthread benchmark.c h618_hub75.c -o hub75_benchmark -pthread
|
||||
cc -O3 -std=c11 -Wall -Wextra -Werror -fPIC -pthread native_test.c h618_hub75.c -o hub75_native_test -pthread
|
||||
cc -O3 -std=c11 -Wall -Wextra -Werror -fPIC -pthread safeoff.c h618_hub75.c -o hub75_safeoff -pthread
|
||||
./hub75_native_test
|
||||
native_bitplane_tests=PASS
|
||||
./hub75_safeoff --fake
|
||||
HUB75 safeoff complete
|
||||
make: Leaving directory '/opt/[private]-screen-controller.stage.1.1.3-layers-20261009-ready/app/display/native'
|
||||
........................................................................ [ 14%]
|
||||
........................................................................ [ 28%]
|
||||
.............................................................s.......... [ 42%]
|
||||
........................................................................ [ 56%]
|
||||
........................................................................ [ 70%]
|
||||
.......s.......................................................s........ [ 84%]
|
||||
........................................................................ [ 98%]
|
||||
.......sss [100%]
|
||||
508 passed, 7 skipped, 389 warnings in 401.84s (0:06:41)
|
||||
PASS: H618 PI pinctrl: allwinner,sun50i-h616-pinctrl
|
||||
PASS: /dev/mem accessible: /dev/mem
|
||||
PASS: /dev/i2c-1 present: /dev/i2c-1
|
||||
PASS: CPU3 present: /sys/devices/system/cpu/cpu3
|
||||
PASS: native HUB75 library: /opt/[private]-screen-controller.stage.1.1.3-layers-20261009-ready/app/display/native/libh618_hub75.so
|
||||
PASS: AArch64 userspace: aarch64
|
||||
PASS: default network route: default via <设备网络地址> dev wlan0 proto static metric 600
|
||||
PASS: NetworkManager active: active
|
||||
PASS: lightdm.service inactive: inactive
|
||||
PASS: gpioc-server.service inactive: inactive
|
||||
PASS: map_device.service inactive: inactive
|
||||
Persistent data prepared successfully: schema=config.json
|
||||
frpc: OK
|
||||
LICENSE: OK
|
||||
frpc binary already verified; skipped
|
||||
frpc 0.71.0 installed as a system component
|
||||
● [private]-screen-controller.service - WalnutPi H618 Matrix Screen Controller
|
||||
Loaded: loaded (/etc/systemd/system/[private]-screen-controller.service; enabled; preset: enabled)
|
||||
Active: active (running) since Fri 2026-10-09 07:36:54 UTC; 9s ago
|
||||
Process: 292616 ExecStartPre=/bin/sh -c cat /proc/sys/kernel/sched_rt_runtime_us > /run/[private]-screen-controller/sched_rt_runtime_us.original && printf "%s
|
||||
" -1 > /proc/sys/kernel/sched_rt_runtime_us (code=exited, status=0/SUCCESS)
|
||||
Process: 292618 ExecStartPre=/opt/[private]-screen-controller/.venv/bin/python /opt/[private]-screen-controller/scripts/dedicated_host.py check --service (code=exited, status=0/SUCCESS)
|
||||
Process: 292624 ExecStartPre=/opt/[private]-screen-controller/app/display/native/hub75_safeoff (code=exited, status=0/SUCCESS)
|
||||
Main PID: 292625 (python)
|
||||
Tasks: 14 (limit: 1021)
|
||||
Memory: 137.5M
|
||||
CPU: 11.644s
|
||||
CGroup: /system.slice/[private]-screen-controller.service
|
||||
└─292625 /opt/[private]-screen-controller/.venv/bin/python -m uvicorn app.main:app --host 0.0.0.0 --port 8080
|
||||
|
||||
Oct 09 07:37:01 [private] python[292625]: File "/opt/[private]-screen-controller/.venv/lib/python3.11/site-packages/dbus_next/message_bus.py", line 712, in _process_message
|
||||
Oct 09 07:37:01 [private] python[292625]: handler(msg, send_reply)
|
||||
Oct 09 07:37:01 [private] python[292625]: File "/opt/[private]-screen-controller/.venv/lib/python3.11/site-packages/dbus_next/message_bus.py", line 898, in _default_properties_handler
|
||||
Oct 09 07:37:01 [private] python[292625]: raise DBusError(
|
||||
Oct 09 07:37:01 [private] python[292625]: dbus_next.errors.DBusError: interface "org.bluez.LEAdvertisement1" does not have property "TxPower"
|
||||
Oct 09 07:37:01 [private] python[292625]: 2026-10-09 07:37:01,456 INFO app.power.voltage: Screen voltage sensor is available
|
||||
Oct 09 07:37:01 [private] python[292625]: 2026-10-09 07:37:01,489 INFO app.monitoring.resources: System resource monitor is available
|
||||
Oct 09 07:37:02 [private] python[292625]: INFO: Application startup complete.
|
||||
Oct 09 07:37:02 [private] python[292625]: INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
|
||||
Oct 09 07:37:02 [private] python[292625]: INFO: 127.0.0.1:47456 - "GET /api/status HTTP/1.1" 200 OK
|
||||
WalnutPi Matrix Screen Controller updated successfully: 1.1.3-layers-20261009-ready
|
||||
WARNING: The directory '/home/[private]/.cache/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you should use sudo's -H flag.
|
||||
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 25 KiB |
@@ -0,0 +1,5 @@
|
||||
私有凭据文件可用;未输出任何凭据值。
|
||||
Preserved all user content/settings/files; obsolete mobile preview caches removed: 13
|
||||
All persistent logical frames, order, durations, metadata and other files unchanged.
|
||||
{"service": {"app_version": "a412c79f4887320b", "software_version": "1.1.3", "feature_updated_at": "2026-10-09T15:27+08:00", "instance_id": "<本次服务实例>"}, "driver": {"actual_refresh_rate_hz": 97.36, "panel_scan_rate_hz": 97.36, "completed_frames": 14796, "completed_scans": 14796, "scans_per_frame": 1, "deadline_misses": 0, "buffer_swaps": 379, "submitted_frames": 379, "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}}
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
{"passed": true, "checks": "save/reload, central output, clip, single/all frames, independent IDs, durations, revision conflicts, 64/192 preview", "driver": {"actual_refresh_rate_hz": 97.377, "panel_scan_rate_hz": 97.377, "completed_frames": 11365, "completed_scans": 11365, "scans_per_frame": 1, "deadline_misses": 0, "buffer_swaps": 291, "submitted_frames": 291, "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}}
|
||||
Removed all independent REST verification content IDs.
|
||||
@@ -0,0 +1 @@
|
||||
仓库卫生检查通过:已检查 706 个 Git 候选文件,未输出任何秘密值。
|
||||
@@ -0,0 +1 @@
|
||||
仓库卫生检查通过:已检查 694 个 Git 候选文件,未输出任何秘密值。
|
||||
@@ -0,0 +1 @@
|
||||
{"verified_source_files": 33, "version": "1.1.3", "feature_updated_at": "2026-10-09T15:27+08:00"}
|
||||
@@ -0,0 +1,9 @@
|
||||
........................................................................ [ 14%]
|
||||
........................................................................ [ 28%]
|
||||
.............................................................s.......... [ 42%]
|
||||
....................................sssssss.......s..................... [ 56%]
|
||||
........................................................................ [ 70%]
|
||||
.......s................................................................ [ 84%]
|
||||
........................................................................ [ 99%]
|
||||
..... [100%]
|
||||
499 passed, 11 skipped, 8390 warnings in 85.15s (0:01:25)
|
||||
@@ -0,0 +1,57 @@
|
||||
........................................................... [100%]
|
||||
============================== warnings summary ===============================
|
||||
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87
|
||||
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:87: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15
|
||||
@no_type_check_decorator
|
||||
|
||||
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: 10 warnings
|
||||
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\dbus_next\service.py:293: DeprecationWarning: 'typing.no_type_check_decorator' is deprecated and slated for removal in Python 3.15
|
||||
@no_type_check_decorator
|
||||
|
||||
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: 83 warnings
|
||||
tests/test_scene_layers.py: 166 warnings
|
||||
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\routing.py:234: DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead
|
||||
is_coroutine = asyncio.iscoroutinefunction(dependant.call)
|
||||
|
||||
测试相关资料\如何测试\本机测试环境\.local\work\layers-implementation\独立 工作区\核桃派软件源代码\app\main.py:2049
|
||||
tests/test_scene_layers.py::test_append_layers_conflict_batch_failure_and_restart
|
||||
tests/test_scene_layers.py::test_text_extended_preview_default_size_and_persistent_clip
|
||||
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-implementation\独立 工作区\核桃派软件源代码\app\main.py:2049: DeprecationWarning:
|
||||
on_event is deprecated, use lifespan event handlers instead.
|
||||
|
||||
Read more about it in the
|
||||
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
|
||||
|
||||
@app.on_event("startup")
|
||||
|
||||
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495
|
||||
测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495
|
||||
tests/test_scene_layers.py::test_append_layers_conflict_batch_failure_and_restart
|
||||
tests/test_scene_layers.py::test_append_layers_conflict_batch_failure_and_restart
|
||||
tests/test_scene_layers.py::test_text_extended_preview_default_size_and_persistent_clip
|
||||
tests/test_scene_layers.py::test_text_extended_preview_default_size_and_persistent_clip
|
||||
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.venv\Lib\site-packages\fastapi\applications.py:4495: DeprecationWarning:
|
||||
on_event is deprecated, use lifespan event handlers instead.
|
||||
|
||||
Read more about it in the
|
||||
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
|
||||
|
||||
return self.router.on_event(event_type)
|
||||
|
||||
测试相关资料\如何测试\本机测试环境\.local\work\layers-implementation\独立 工作区\核桃派软件源代码\app\main.py:2079
|
||||
tests/test_scene_layers.py::test_append_layers_conflict_batch_failure_and_restart
|
||||
tests/test_scene_layers.py::test_text_extended_preview_default_size_and_persistent_clip
|
||||
<仓库根目录>\测试相关资料\如何测试\本机测试环境\.local\work\layers-implementation\独立 工作区\核桃派软件源代码\app\main.py:2079: DeprecationWarning:
|
||||
on_event is deprecated, use lifespan event handlers instead.
|
||||
|
||||
Read more about it in the
|
||||
[FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
|
||||
|
||||
@app.on_event("shutdown")
|
||||
|
||||
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
|
||||
59 passed, 276 warnings in 3.45s
|
||||
@@ -0,0 +1,16 @@
|
||||
ffmpeg version N-125146-gc6bb22dea0-20260621 Copyright (c) 2000-2026 the FFmpeg developers
|
||||
built with gcc 15.2.0 (crosstool-NG 1.28.0.23_185f348)
|
||||
configuration: --prefix=/ffbuild/prefix --pkg-config-flags=--static --pkg-config=pkg-config --cross-prefix=x86_64-w64-mingw32- --arch=x86_64 --target-os=mingw32 --enable-gpl --enable-version3 --disable-debug --enable-shared --disable-static --disable-w32threads --enable-pthreads --enable-iconv --enable-zlib --enable-libxml2 --enable-libvmaf --enable-fontconfig --enable-libharfbuzz --enable-libfreetype --enable-libfribidi --enable-vulkan --enable-libshaderc --enable-libvorbis --disable-libxcb --disable-xlib --disable-libpulse --enable-gmp --enable-lzma --enable-liblcevc-dec --enable-opencl --enable-amf --enable-libaom --enable-libaribb24 --enable-avisynth --enable-chromaprint --enable-libdav1d --enable-libdavs2 --enable-libdvdread --enable-libdvdnav --disable-libfdk-aac --enable-ffnvcodec --enable-cuda-llvm --enable-frei0r --enable-libgme --enable-libkvazaar --enable-libaribcaption --enable-libass --enable-libbluray --enable-libjxl --enable-libmp3lame --enable-libopus --enable-libplacebo --enable-librist --enable-libssh --enable-libtheora --enable-libvpx --enable-libwebp --enable-libzmq --enable-lv2 --enable-libvpl --enable-openal --enable-liboapv --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenh264 --enable-libopenjpeg --enable-libopenmpt --enable-librav1e --enable-librubberband --enable-schannel --enable-sdl2 --enable-libsnappy --enable-libsoxr --enable-libsrt --enable-libsvtav1 --enable-libtwolame --enable-libuavs3d --disable-libdrm --enable-vaapi --enable-libvidstab --enable-libvvenc --disable-whisper --enable-libx264 --enable-libx265 --enable-libxavs2 --enable-libxvid --enable-libzimg --enable-libzvbi --extra-cflags=-DLIBTWOLAME_STATIC --extra-cxxflags= --extra-libs=-lgomp --extra-ldflags=-pthread --extra-ldexeflags= --cc=x86_64-w64-mingw32-gcc --cxx=x86_64-w64-mingw32-g++ --ar=x86_64-w64-mingw32-gcc-ar --ranlib=x86_64-w64-mingw32-gcc-ranlib --nm=x86_64-w64-mingw32-gcc-nm --extra-version=20260621
|
||||
libavutil 60. 33.101 / 60. 33.101
|
||||
libavcodec 62. 36.101 / 62. 36.101
|
||||
libavformat 62. 19.101 / 62. 19.101
|
||||
libavdevice 62. 4.100 / 62. 4.100
|
||||
libavfilter 11. 17.100 / 11. 17.100
|
||||
libswscale 9. 8.100 / 9. 8.100
|
||||
libswresample 6. 4.100 / 6. 4.100
|
||||
|
||||
Exiting with exit code 0
|
||||
......s [100%]
|
||||
=========================== short test summary info ===========================
|
||||
SKIPPED [1] tests\test_media_formats.py:64: libheif examples are not installed
|
||||
6 passed, 1 skipped in 1.83s
|
||||
@@ -0,0 +1,2 @@
|
||||
........................................................... [100%]
|
||||
59 passed, 276 warnings in 3.05s
|
||||
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 26 KiB |
@@ -0,0 +1,95 @@
|
||||
✔ derives automatic frame names from current animation name and position (1.2763ms)
|
||||
✔ keeps custom frame names and restores automatic names when cleared (0.1825ms)
|
||||
✔ builds non-repeating animation edit context names (0.181ms)
|
||||
✔ selects saved animation preview frames by ordered durations (0.9958ms)
|
||||
✔ loads every preview frame through revision-checked pagination (0.7561ms)
|
||||
✔ validates configurable animation preview concurrency (1.9627ms)
|
||||
✔ rejects mixed revisions instead of showing a partial animation (1.0326ms)
|
||||
✔ validates frame duration only when explicitly called (1.176ms)
|
||||
✔ moves selected frames as one ordered group (0.5676ms)
|
||||
✔ protects an eight pixel ring around interactive drag controls (0.4859ms)
|
||||
✔ reorders mixed library keys without mutating the source list (0.3325ms)
|
||||
✔ restores drag eligibility after protected pointer cancellation and drag end (1.1104ms)
|
||||
✔ animation workspace exposes two previews and the simplified control order (23.9095ms)
|
||||
✔ normal and pixel modes expose independent ranges and presets (3.1862ms)
|
||||
✔ pixel stamps are exact squares from 1x1 through 4x4 (0.4014ms)
|
||||
✔ pixel stamps clip at every canvas edge (0.2968ms)
|
||||
✔ normal circle geometry remains unchanged (0.1377ms)
|
||||
✔ line interpolation includes endpoints without coordinate gaps (0.3125ms)
|
||||
✔ older tools migrate while v3 restores the coordinate guide choice (0.3512ms)
|
||||
✔ coordinate guide spacing adapts to the transformed logical pixel size (0.2046ms)
|
||||
✔ coordinate guide ticks preserve logical values through zoom and pan (0.2702ms)
|
||||
✔ pixel mode markup and grid stay accessible and non-interactive (14.9772ms)
|
||||
✔ pixel undo history stores changed snapshots, caps entries, and clears (0.9471ms)
|
||||
✔ canvas view clamps scale and keeps a visible section in the viewport (0.4943ms)
|
||||
✔ zooming around an anchor preserves its logical position (0.2473ms)
|
||||
✔ floating editor button stays inside its safe viewport bounds (0.1309ms)
|
||||
✔ canvas editor markup, guarded input, and checkpoint events stay wired (4.5038ms)
|
||||
✔ normalizes and converts hexadecimal colors (3.1945ms)
|
||||
✔ converts RGB and HSV boundaries (0.699ms)
|
||||
✔ round trips representative colors within 8-bit rounding (0.9168ms)
|
||||
✔ recent colors deduplicate, normalize, and evict the oldest (0.4437ms)
|
||||
✔ formats and projects looping playback without moving paused content (1.752ms)
|
||||
✔ seek dispatcher keeps one request in flight and flushes the newest position (3.93ms)
|
||||
✔ topbar current display dialog exposes static close and animation controls (8.6886ms)
|
||||
✔ device workspace exposes the compact immediate pure-color test flow (12.5038ms)
|
||||
✔ font catalog normalization, grouping, and search are stable (3.6219ms)
|
||||
✔ font picker implements commit-only searchable combobox keyboard behavior (6.5188ms)
|
||||
✔ settings places unrestricted FRP maintenance at the bottom (9.7463ms)
|
||||
✔ FRP editor uses raw server storage and official validation errors (2.0804ms)
|
||||
✔ network diagnostics renders layered evidence (4.4397ms)
|
||||
✔ unavailable controls never masquerade as indefinite loading (9.4291ms)
|
||||
✔ action controls do not bypass the shared state module (14.0548ms)
|
||||
✔ HTTP requests time out with a stable user-facing error (10.9642ms)
|
||||
✔ demo library actions stay black, explain restrictions, and preserve copy (1.7026ms)
|
||||
✔ sortable cards protect controls and keep demo cards fixed (1.9263ms)
|
||||
✔ media import workspace exposes streaming upload, crop controls, and queue polling (2.0486ms)
|
||||
✔ free framing starts from the complete source and keeps one pixel visible (1.1908ms)
|
||||
✔ free framing copy is stable and catalogued (0.1702ms)
|
||||
✔ upload action has visible ordinary-build copy (0.3722ms)
|
||||
✔ media naming happens after analysis and conflicts keep the draft (0.2871ms)
|
||||
✔ awaiting-settings cards survive polling without hiding server transitions (0.2058ms)
|
||||
✔ old scene migration rejects unknown fields and duplicate text without filtering (71.3308ms)
|
||||
✔ PNG compression round trips sparse and full brush pixels without DOM (8.2936ms)
|
||||
✔ blank and black are distinct; independent backgrounds follow layer order (5.6738ms)
|
||||
✔ disabled background colors stay independent through storage and copy (21.0577ms)
|
||||
✔ extended pixels survive storage but never enter the central output (9.418ms)
|
||||
✔ move preview does not mutate source; confirmed clipping removes only outside ink (25.3666ms)
|
||||
✔ text clipping follows anchor and scale and is retained after edit/reload/copy (9.4652ms)
|
||||
✔ multiple text groups isolate edits, copies and IDs (0.5377ms)
|
||||
✔ strict v2 storage protects unknown data and the final brush invariant (7.1636ms)
|
||||
✔ creates a fixed 64x64 RGB scene (11.4014ms)
|
||||
✔ serializes pixelRgb as base64 and round trips an independent scene (54.9539ms)
|
||||
✔ moves a valid v1 draft to the stable key before removing exact legacy keys (45.076ms)
|
||||
✔ keeps the v1 draft and all legacy keys when stable-key migration cannot write (20.6105ms)
|
||||
✔ preserves and blocks a future stable draft instead of falling back or writing blank (8.6419ms)
|
||||
✔ preserves and blocks a damaged stable draft (0.4874ms)
|
||||
✔ does not discard a damaged higher-priority legacy key during fallback migration (3.3709ms)
|
||||
✔ rejects damaged scene roots while skipping only damaged elements (8.7487ms)
|
||||
✔ normalizes text fields and creates a centered lowercase ok element (0.4622ms)
|
||||
✔ migrates the first valid canvas by v3, v2, legacy priority and merges text v1 (17.8965ms)
|
||||
✔ supports independent add, update, and delete operations for multiple text elements (0.8215ms)
|
||||
✔ duplicates with a deep copy, new id, 2px offset, and topmost order (0.502ms)
|
||||
✔ alpha-composites full RGBA layers in array order without mutating inputs (2.4435ms)
|
||||
✔ settings brightness explains an active temporary display-test override (12.3309ms)
|
||||
✔ settings exposes full OTA upload progress and service recovery polling (6.7881ms)
|
||||
✔ settings automatically opens and safely copies a detailed OTA failure log (4.2111ms)
|
||||
✔ settings exposes a transactional performance-mode switch with the fixed warning (2.3383ms)
|
||||
✔ settings exposes persisted animation preview concurrency below performance mode (2.3375ms)
|
||||
✔ template edit baseline distinguishes clean, dirty, and unbound scenes (1.8657ms)
|
||||
✔ template manager uses a monitor and unified four-row card actions (18.9569ms)
|
||||
✔ animation editing backs up and restores template edit ownership (3.8261ms)
|
||||
✔ special editor exposes the agreed modes and guarded editing flow (9.4519ms)
|
||||
✔ latched WiFi draft state remains dirty until explicitly cleared (3.7375ms)
|
||||
✔ WiFi settings expose independent network and prompt-delay controls (5.8772ms)
|
||||
✔ workspace order resolves saved ids and appends new registrations (1.7218ms)
|
||||
✔ workspace order movement is immutable and respects both boundaries (0.3358ms)
|
||||
✔ drawer exposes one editable list and commits only from the save action (8.5284ms)
|
||||
ℹ tests 87
|
||||
ℹ suites 0
|
||||
ℹ pass 87
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 866.8466
|
||||
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 45 KiB |
@@ -0,0 +1,2 @@
|
||||
. [100%]
|
||||
1 passed, 189 warnings in 2.27s
|
||||