oep-client-python 0.0.52__tar.gz → 0.0.54__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/CHANGELOG.md +54 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/PKG-INFO +1 -1
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/pyproject.toml +1 -1
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/__init__.py +1 -1
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/__main__.py +89 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/arm.py +13 -0
- oep_client_python-0.0.54/src/oep_client/call.py +284 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/catalog.py +70 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/__init__.py +1 -1
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/core_smoke.py +1 -1
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/host_core.py +1 -1
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/host_deadline.py +2 -2
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/host_requests.py +2 -2
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/host_wait.py +2 -2
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/dump.py +7 -1
- oep_client_python-0.0.54/src/oep_client/pyserial/__init__.py +1 -0
- oep_client_python-0.0.54/src/oep_client/pyserial/protocol_oep.py +92 -0
- oep_client_python-0.0.54/src/oep_client/pytest_rp2040_peer.py +68 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/registry.py +5 -5
- oep_client_python-0.0.54/src/oep_client/rp2040.py +68 -0
- oep_client_python-0.0.54/src/oep_client/rp2040_peer.py +358 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/rp2350.py +11 -8
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/virtual_bench.py +14 -2
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/spec/DOCS_SHA256 +2 -2
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/spec/oep-v1.toml +25 -1
- oep_client_python-0.0.54/tests/test_call.py +234 -0
- oep_client_python-0.0.54/tests/test_rp2040_peer.py +107 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_target_parts.py +50 -2
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_trace_core.py +6 -3
- oep_client_python-0.0.54/tests/vectors/SPEC_COMMIT +1 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/vectors/SPEC_SHA256 +4 -4
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/vectors/ops.json +35 -35
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/vectors/settings_file.json +2 -2
- oep_client_python-0.0.52/tests/vectors/SPEC_COMMIT +0 -1
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/.gitignore +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/LICENSE +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/README.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/README.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/README.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/allocator-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/analog-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/analog-payload-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/arm-adi-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/attach-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/block-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/capture-group-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/capture-group-geometry-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/capture-metadata-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/capture-serial-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/capture-timeline-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/capture-timeline-lifecycle-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/clock-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/config-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/config-execution-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/config-fallback-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/config-paging-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/config-power-loss-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/config-storage-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/conformance-checks.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/conformance-spec-compatibility.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/core-fixed-fields-review.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/core-smoke-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/corr-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/cut-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/data-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/debug-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/dependency-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/discovery-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/dmseq-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/dmseq-target-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/execution-order-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/exhausted-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/fixture-metadata-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/gpio-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/gpio-lifecycle-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/hardware-configuration.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/hardware-quickstart.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/hardware-schema.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/host-core-shapes-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/host-deadline-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/host-notification-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/host-request-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/host-resend-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/host-tlv-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/host-value-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/host-wait-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/i2c-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/interface-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/interface-smoke-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/lease-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/link-routes-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/link-transfer-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/logic-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/mailbox-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/notification-output-sample.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/notification-retention-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/notification-sequence-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/oep-declaration-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/oep-example-smoke-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/outcome-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/pin-constraints-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/pipeline-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/port-speed-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/probe-input-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/recovery-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/recovery-races-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/refusal-order-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/registered-ops-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/replay-pressure-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/reset-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/resource-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/response-race-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/restart-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/retention-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/retention-lifecycle-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/retry-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/route-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/run-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/scan-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/scan-options-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/selected-metadata-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/session-loss-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/session-smoke-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/spec-follow-notes.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/spi-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/step-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/stream-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/subscription-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/tcp-recovery-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/testing-consumers.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/testing-policy.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/tlv-request-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/trace/README.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/trace/capture.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/trace/common.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/trace/console.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/trace/core.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/trace/debug.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/trace/fixture.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/trace/link.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/trace/plan.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/trace/restart.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/trace/transports.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/uart-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/uart-stream-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/usb-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/wire-options-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/docs/writer-lease-conformance.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/acquire.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/capture.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/capture_blocks.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/ch32_flash.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/cobs.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/allocator.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/allocator_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/allocator_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/analog.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/analog_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/analog_payload.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/analog_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/arm_adi.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/arm_adi_blocks.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/arm_adi_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/arm_adi_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/attach.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/attach_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/attach_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/block_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/block_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/blocks.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_group.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_group_geometry.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_group_geometry_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_group_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_group_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_metadata.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_metadata_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_serial.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_serial_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_timeline.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_timeline_lifecycle.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_timeline_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_timeline_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/clock.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/clock_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/clock_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/core_fixed_fields.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/corr.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/cut.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/cut_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/cut_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/data.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/data_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/data_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/debug.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/debug_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/debug_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/declaration_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/dependencies.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/dependency_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/dependency_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/discovery.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/dmseq.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/dmseq_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/dmseq_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/dmseq_target.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/dmseq_target_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/dmseq_target_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/execution_order.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/execution_order_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/exhausted.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/exhausted_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/fixture_metadata.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/fixture_metadata_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/force_hw.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/gpio.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/gpio_lifecycle.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/gpio_lifecycle_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/gpio_lifecycle_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/gpio_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/gpio_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/host_core_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/host_deadline_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/host_notifications.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/host_notifications_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/host_request_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/host_resend.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/host_resend_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/host_tlv.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/host_tlv_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/host_values.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/host_values_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/host_wait_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/i2c.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/i2c_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/i2c_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/interface_smoke.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/interfaces.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/lease.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/lease_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/link_routes.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/link_routes_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/link_routes_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/link_transfer_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/link_transfer_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/link_transfers.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/logic.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/logic_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/logic_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/mailbox.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/mailbox_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/mailbox_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/notification_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/notification_retention.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/notification_retention_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/notification_sequence.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/notification_sequence_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/notify_hw.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/oep_declaration_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/oep_declarations.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/oep_smoke.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/outcome_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/outcome_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/outcomes.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/pipeline.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/pipeline_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/pipeline_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/port_speed.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/port_speed_execution.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/port_speed_execution_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/port_speed_execution_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/port_speed_lifecycle.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/port_speed_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/port_speed_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/probe_input.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/probe_input_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/recovery.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/recovery_race_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/recovery_races.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/recovery_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/refusal_order.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/refusal_order_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/registered_ops.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/registered_ops_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/release_hw.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/replay_pressure.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/reset.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/reset_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/reset_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/resource_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/resource_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/resources.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/response_race.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/response_race_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/restart.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/restart_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/restart_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/retention.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/retention_lifecycle.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/retention_lifecycle_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/retention_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/retention_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/retry.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/retry_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/retry_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/route_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/route_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/routes.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/run.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/run_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/run_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/scan.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/scan_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/scan_options.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/scan_options_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/scan_options_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/scan_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/selected_metadata.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/selected_metadata_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/serial.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/session_loss.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/session_loss_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/session_smoke.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/spi.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/spi_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/spi_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/step.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/step_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/step_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/stream.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/stream_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/stream_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/subscription_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/subscriptions.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/tcp.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/tcp_peers.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/tcp_recovery.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/tcp_recovery_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/tlv_request_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/tlv_requests.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/uart.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/uart_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/uart_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/uart_stream.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/uart_stream_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/usb.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/usb_cases.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/usb_hw.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/usb_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/wire_options.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/wire_options_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/wire_options_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/writer_lease.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/writer_lease_model.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/writer_lease_sample.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/console.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/core.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/discovery.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/endpoint.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/fixture.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/frames.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/hardware.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/hid_stream.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/host.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/interfaces.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/kept_session.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/link.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/linktest.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/memo.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/message.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/names.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/pins.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/probe_log.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/pytest_conformance.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/riscv.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/settings.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/speed_record.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/stimulus.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/targets.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/uiapduino.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/usb_stream.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/virtual_bench_capture.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/virtual_bench_mdns.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/virtual_bench_serial.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/virtual_bench_serve.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/virtual_bench_trigger.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/virtual_bench_usb.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/virtual_core.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/virtual_fixture_drive.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/virtual_names.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/conftest.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/equipment/.env.example +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/equipment/test_core_contract.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/equipment/test_preflight.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/fixtures/hardware.virtual.toml +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/.env.example +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/.env.virtual.example +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/README.ja.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/README.md +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/__init__.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/boards.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/conftest.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/firmware.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/flash.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/hardware.example.toml +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/hardware.resolved.example.toml +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/record.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/.gitignore +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.26+5bafb92-0.0.26.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.26+654b06a-0.0.26.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.27+ec1df99-0.0.27.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32+1491c13-0.0.31-20261016T133559.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32+672bf7b-0.0.32-20261016T164655.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131458.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131510.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131526.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131532.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131656.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131703.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131708.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132050.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132057.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132104.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.36+f8ac55a-0.0.36-20261022T160307.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.36+f8ac55a-0.0.36-20261022T161655.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.37+1031feb-0.0.37-20261023T214002.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.38+7c158ff-0.0.38-20261027T081156.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+1ad47c7-0.0.39-20261027T182907.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+2c0c41f-0.0.39-20261027T174907.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+9317805-0.0.39-20261027T191153.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+a75fd45-0.0.39-20261027T205055.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201038.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201057.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201058.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201059.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896__crash_at_2106_s_-0.0.39-20261027T204608.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+d4d323c-0.0.39-20261028T190815.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+d4d323c-0.0.39-20261028T191854.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+1ad47c7-0.0.39-20261027T181116.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+1ad47c7-0.0.39-20261027T181812.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+1ad47c7-0.0.39-20261027T182903.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+62463f2-0.0.39-20261029T145541.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+9317805-0.0.39-20261027T191150.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+a75fd45-0.0.39-20261028T190803.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+b7fbdf9-0.0.39-20261027T191727.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+b7fbdf9-0.0.39-20261027T204611.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+bb371fb-0.0.39-20261028T191811.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+bb371fb-0.0.39-20261028T191849.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.44+34c0b0b-0.0.44-20261104T190820.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.44+34c0b0b-0.0.44-20261104T190903.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-unknown-0.0.44-20261104T190857.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.26+4fad559-0.0.26.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.26+5bafb92-0.0.26.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32+1491c13-0.0.31-20261016T133501.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32+672bf7b-0.0.32-20261016T164559.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32-0.0.31-20261016T130922.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32-0.0.31-20261016T131024.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.36+12e1222-0.0.37-20261023T214016.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.36+f8ac55a-0.0.36-20261022T160134.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.37+1031feb-0.0.37-20261023T214230.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.38+7c158ff-0.0.38-20261027T081159.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+2c0c41f-0.0.39-20261027T174933.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+9317805-0.0.39-20261027T191154.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+b7fbdf9-0.0.39-20261027T204617.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+bb371fb-0.0.39-20261028T191816.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.25-0.0.26.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+5bafb92-0.0.26.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+654b06a-0.0.26.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+e877631-0.0.26.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27+ac80e07-0.0.27.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27+ec1df99-0.0.27.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27-0.0.27.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.28-0.0.28.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb-0.0.37-20261023T220718.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb-0.0.37-20261023T221106.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb__panic_at_11_s_-0.0.37-20261023T220856.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb__panic_at_11_s_-0.0.37-20261023T220901.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb__panic_at_11_s_-0.0.37-20261023T220915.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-unknown-0.0.26.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-unknown-0.0.37-20261023T214102.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-unknown-0.0.39-20261028T190818.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0e31108-0.0.26+5bafb92-0.0.26.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0e31108-0.0.26+654b06a-0.0.26.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0e31108-0.0.44+34c0b0b-0.0.44-20261104T190941.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0e343c6-0.0.26+5bafb92-0.0.26.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0e343c6-0.0.26+654b06a-0.0.26.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0e343c6-0.0.27+ec1df99-0.0.27.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0e343c6-0.0.28+ffe4eb1-0.0.28.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0e343c6-0.0.28-0.0.28.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+0f013b7-0.0.28.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+1c940ca-0.0.28.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+4ef21db+4ef21db-dirty-0.0.28.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+68d9694-0.0.28.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+ec38b1d-0.0.28.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+ffe4eb1-0.0.28.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28-0.0.28.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.36+f8ac55a-0.0.36-20261022T160503.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.37+1031feb-0.0.37-20261023T214005.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.38+7c158ff-0.0.38-20261027T081145.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.38+7c158ff-0.0.38-20261027T081152.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+1ad47c7-0.0.39-20261027T180716.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+1ad47c7-0.0.39-20261027T182855.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+1ad47c7-0.0.39-20261027T183107.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f-0.0.39-20261027T174908.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f__task-wdt_at_18_s_-0.0.39-20261027T175743.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f__task-wdt_at_18_s_-0.0.39-20261027T175815.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f__task-wdt_at_33_s_-0.0.39-20261027T175634.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f__task-wdt_at_431_s_-0.0.39-20261027T175709.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+62463f2-0.0.39-20261029T145536.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+7445bee-0.0.39-20261027T155413.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+9317805-0.0.39-20261027T191146.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+b7fbdf9-0.0.39-20261027T191724.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+bb371fb-0.0.39-20261028T191806.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+bb371fb-0.0.39-20261028T191843.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+d4d323c-0.0.39-20261028T190809.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-unknown-0.0.36-20261022T160222.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-unknown-0.0.39-20261027T155301.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-unknown-0.0.39-20261027T155340.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/test_harness.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/hw/test_probe.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/spec_names.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_acquire.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_acquire_beside.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_address.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_capabilities.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_capture.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_capture_blocks.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_capture_generation_rules.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_capture_rules.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_cobs.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_allocator.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_analog.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_analog_payload.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_arm_adi.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_arm_adi_blocks.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_attach.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_blocks.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_capture_group.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_capture_group_geometry.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_capture_metadata.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_capture_serial.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_capture_timeline.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_capture_timeline_lifecycle.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_clock.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_core_fixed_fields.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_core_smoke.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_corr.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_cut.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_data.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_debug.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_dependencies.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_discovery.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_dmseq.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_dmseq_target.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_execution_order.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_exhausted.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_fixture_metadata.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_force_hw.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_gpio.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_gpio_lifecycle.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_host_core.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_host_critical_calls.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_host_deadline.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_host_notifications.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_host_requests.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_host_resend.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_host_tlv.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_host_values.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_host_wait.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_i2c.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_interface_smoke.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_interfaces.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_lease.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_link_routes.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_link_transfers.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_logic.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_mailbox.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_notification_output.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_notification_retention.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_notification_sequence.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_oep_declarations.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_oep_smoke.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_outcomes.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_pipeline.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_port_speed.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_port_speed_execution.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_port_speed_lifecycle.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_probe_input.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_reconnect.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_recovery.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_recovery_races.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_refusal_order.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_registered_ops.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_replay_pressure.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_replay_records_optional.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_reset.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_resources.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_response_race.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_restart.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_retention.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_retention_lifecycle.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_retry.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_reviewed_pins.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_routes.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_run.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_scan.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_scan_options.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_selected_metadata.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_serial.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_session_loss.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_session_smoke.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_spec_guard.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_spi.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_step.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_stream.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_subscriptions.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_tcp.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_tcp_peers.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_tcp_recovery.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_tlv_requests.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_uart.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_uart_stream.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_usb.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_wire_options.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_conformance_writer_lease.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_console_queue_and_reset_settle.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_core_rules.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_debug_attach.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_debug_rules.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_describe_unset_idle_rules.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_exact_payload_rules.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_extension_patterns.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_fixture_controllers.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_fixture_link_settings_rules.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_fixture_out.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_fixture_targets.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_flash_console.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_gpio_drive_and_serve_options.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_hardware.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_hid_stream.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_host_boot_lifecycle.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_host_recovery_rules.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_host_rules_bounds_options.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_host_rules_waits_lines.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_host_wait_bound.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_interfaces.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_link_drop.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_link_host.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_link_serial.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_linktest.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_literals.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_memo.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_minimal_ops.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_no_resume.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_open_extensions.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_passthrough.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_pins.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_plan.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_port_speed.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_probe_log.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_request_tails.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_request_validation_rules.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_restart.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_resubscribe_after_reopen.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_rvswd_rest.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_session.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_settings.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_spec_sections.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_spec_vectors.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_state_resource_rules.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_stimulus.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_tcp_discovery.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_tlv_reader_rules.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_trace_capture.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_trace_common.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_trace_console.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_trace_core_names.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_trace_debug.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_trace_fixture.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_trace_fixture_drive.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_trace_link.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_trace_plan.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_trace_restart.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_trace_transports.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_transport_session_rules.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_usb_identity.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_usb_stream.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_analog_roles.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_announce.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_changing_trigger.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_channel_time.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_format_2.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_formats.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_initial_trigger_time.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_lifetime.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_notifications.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_one_shot_time.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_options.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_pretrigger.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_query.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_rates.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_requests.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_resume_calibration.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_trigger_modes.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_trigger_source.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_trigger_source_more.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_waiting.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_fast_samples.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_pin_constraints.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_rules_core.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_rules_ops_lines.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_serve_reboot.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_serve_tcp_connections.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_spec.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_bench_targets.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_core.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_virtual_core_bool.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/test_wire_hold.py +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/vectors/capture_formats.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/vectors/checks.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/vectors/cobs.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/vectors/confirm.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/vectors/core_extensions.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/vectors/core_lifecycle.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/vectors/core_policy.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/vectors/discovery.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/vectors/headers.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/vectors/interface_boundaries.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/vectors/interface_profiles.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/vectors/logic_layout.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/vectors/ops_encoding.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/vectors/refusals.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/tests/vectors/sessions.json +0 -0
- {oep_client_python-0.0.52 → oep_client_python-0.0.54}/udev/70-oep-probe.rules +0 -0
|
@@ -2,6 +2,60 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.0.54
|
|
6
|
+
- (EN) Jobs (oep::SimpleInterface::job, the probe's worker): `oep_client.call.call_wait(hst, interface, op, timeout=,
|
|
7
|
+
wait=, **fields)` starts the job and reads its status op until it ends; it returns the status's fields (start_ns,
|
|
8
|
+
end_ns on the probe's clock) or raises `JobFailed` (code, message), `JobCancelled`, `JobTimeout` (a cancel sent
|
|
9
|
+
first) or `ProbeRestarted` (the boot_id changed). `wait(seconds)` is called between the reads (a stream's wait keeps
|
|
10
|
+
a capture going). `oep call ... --wait S` does the same from the command line.
|
|
11
|
+
- (JA) ジョブ(oep::SimpleInterface::job、プローブのワーカー): `oep_client.call.call_wait(hst, interface, op, timeout=,
|
|
12
|
+
wait=, **欄)` はジョブを始め、終わるまで status の op を読む。status の欄(プローブの時計の start_ns、end_ns)を返すか、
|
|
13
|
+
`JobFailed`(番号、文)、`JobCancelled`、`JobTimeout`(先に cancel を送る)、`ProbeRestarted`(boot_id が変わった)を投げる。
|
|
14
|
+
読む間に `wait(秒)` を呼ぶ(流し続けの wait なら取り込みが続く)。コマンドラインは `oep call ... --wait S`。
|
|
15
|
+
- (EN) Any interface's op from the command line and Python: `oep call PROBE INTERFACE OP [ARGS...]` - by number with
|
|
16
|
+
the request as hex bytes, or by the name and fields its describe gives (oep-spec core §7.4 op_name / op_field,
|
|
17
|
+
draft e392ad5): `oep call oep://… io.github.you.mine add a=2 b=3` -> `completed rev 1 sum=5`. Python:
|
|
18
|
+
`oep_client.call.call(hst, interface, op, payload=None, **fields)` returns the success fields by name (a dict and
|
|
19
|
+
attributes, `.revision`, `.payload`); `CommandRejected`, `CommandFailed` (code and message), and `InterfaceMissing` /
|
|
20
|
+
`RevisionMismatch` / `OpMissing`, all `NotOffered` for a test's skip. `oep dump` shows an op's signature
|
|
21
|
+
(`add(a: i32, b: i32) -> sum: i32`). The virtual bench's stand-in fn gives its two ops' names and fields. Registry,
|
|
22
|
+
vectors and the reviewed digests synced from oep-spec e392ad5 (the core's §7.4 tags and transports §3.1
|
|
23
|
+
usb.transports: the virtual bench knows the item).
|
|
24
|
+
- (JA) どのインターフェースの op もコマンドラインと Python から呼べる: `oep call PROBE INTERFACE OP [ARGS...]`。番号と 16 進の
|
|
25
|
+
要求で、または describe が示す名前と欄で(oep-spec core §7.4 op_name / op_field、案 e392ad5):
|
|
26
|
+
`oep call oep://… io.github.you.mine add a=2 b=3` → `completed rev 1 sum=5`。Python は
|
|
27
|
+
`oep_client.call.call(hst, interface, op, payload=None, **fields)` で、成功の欄を名前で返す(辞書と属性、`.revision`、
|
|
28
|
+
`.payload`)。`CommandRejected`、`CommandFailed`(番号と文)、`InterfaceMissing` / `RevisionMismatch` / `OpMissing`(どれも
|
|
29
|
+
`NotOffered`: 試験の skip に)。`oep dump` は op の形(`add(a: i32, b: i32) -> sum: i32`)を出す。仮想ベンチの代役の fn は
|
|
30
|
+
2 つの op の名前と欄を持つ。registry、ベクタ、確かめた文書のダイジェストを oep-spec e392ad5 に合わせた(core §7.4 のタグと
|
|
31
|
+
transports §3.1 の usb.transports。仮想ベンチはその項目を知る)。
|
|
32
|
+
|
|
33
|
+
## 0.0.53
|
|
34
|
+
- (EN) An RP2040 board as a test's peer over an OEP probe's SWD alone (`oep_client.rp2040_peer`), for a peer whose USB goes to
|
|
35
|
+
the device under test: `python -m oep_client.rp2040_peer flash oep://<probe>/<port> <elf|bin>` (the port's labels
|
|
36
|
+
`<port>.swdio` / `<port>.swclk`; through ch32rv's broker sharing its lock when it runs, found with `$CH32RV`; the old
|
|
37
|
+
image's SEGGER RTT IDs left in RAM are wiped before the reboot, so the console finds the new one's), the console as
|
|
38
|
+
SEGGER RTT through the MEM-AP (`console`, and pyserial's `oep://` handler in `oep_client.pyserial`), and
|
|
39
|
+
`pytest_plugins = ["oep_client.pytest_rp2040_peer"]` for pytest-embedded-arduino-cli: arduino-pico's OpenOCD upload
|
|
40
|
+
(`uploadmethod=picoprobe_cmsis_dap`) handed to the writer through generated hook files, the peer's own device lock,
|
|
41
|
+
the DUT's ch32rv passed on.
|
|
42
|
+
- (JA) RP2040 の基板を、OEP のプローブの SWD だけで試験の相手(peer)にする(`oep_client.rp2040_peer`)。USB を DUT に
|
|
43
|
+
つなぐ相手のため。`python -m oep_client.rp2040_peer flash oep://<probe>/<port> <elf|bin>`(口のラベル `<port>.swdio` /
|
|
44
|
+
`<port>.swclk`。ch32rv の broker が動いていれば、そのロックに相乗りする。broker は `$CH32RV` で探す。RAM に残った前の
|
|
45
|
+
イメージの SEGGER RTT の ID は起動し直す前に消し、コンソールが新しいものを見つけるようにする)、コンソールは
|
|
46
|
+
MEM-AP の上の SEGGER RTT(`console`、pyserial の `oep://` の handler は `oep_client.pyserial`)。pytest-embedded-arduino-cli
|
|
47
|
+
には `pytest_plugins = ["oep_client.pytest_rp2040_peer"]`: arduino-pico の OpenOCD の書き込み(`uploadmethod=picoprobe_cmsis_dap`)
|
|
48
|
+
を、書き出した hook のファイルで書き込みの道具に渡す。peer のロックは自分のもの。DUT の ch32rv を引き渡す。
|
|
49
|
+
- (EN) `rp2040`: the RP2040's flash written over SWD through its boot ROM (`rom_table_lookup` at 0x18 on the function
|
|
50
|
+
table at 0x14), the sequence shared with `rp2350.Flash` (which now takes another chip's ROM lookup and spare RAM), and
|
|
51
|
+
a reboot by the watchdog the pico-sdk's way (PSM WDSEL all but the oscillators, SCRATCH4 0: left as it comes, the
|
|
52
|
+
trigger restarted nothing). `arm.CortexM.reset_halt()`: reset the core and stop on its first instruction (a core
|
|
53
|
+
locked up in a fault handler is no place to call the ROM from).
|
|
54
|
+
- (JA) `rp2040`: RP2040 の flash を SWD でブート ROM から書く(関数表は 0x14、`rom_table_lookup` は 0x18)。手順は `rp2350.Flash` と
|
|
55
|
+
共通にし、Flash はほかのチップの ROM の引き方と空いている RAM を受け取れるようにした。起動し直しは pico-sdk と同じウォッチドッグの
|
|
56
|
+
手順(PSM の WDSEL を発振器以外すべて、SCRATCH4 を 0。そのままではトリガしても何も起動し直さなかった)。`arm.CortexM.reset_halt()`:
|
|
57
|
+
コアをリセットして最初の命令で止める(fault の処理の途中で lockup したコアからは ROM を呼べない)。
|
|
58
|
+
|
|
5
59
|
## 0.0.52
|
|
6
60
|
- (EN) Capture format 1 is per-channel reductions (oep-spec 165a278, capture §1.3): `LogicCapture.configure(...,
|
|
7
61
|
carriage={role: (carriage, D)})` with capture_blocks.SAMPLE / ANY_HIGH / ANY_LOW / CHANGE_LATCH (the `events`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: oep-client-python
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.54
|
|
4
4
|
Summary: Open Embedded Probe (OEP) v1 host: serial / USB / TCP transports, the session rules, the standard interfaces, and a virtual bench
|
|
5
5
|
Project-URL: Homepage, https://github.com/Open-Embedded-Probe/oep-client-python
|
|
6
6
|
Project-URL: Repository, https://github.com/Open-Embedded-Probe/oep-client-python
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "oep-client-python"
|
|
7
|
-
version = "0.0.
|
|
7
|
+
version = "0.0.54"
|
|
8
8
|
description = "Open Embedded Probe (OEP) v1 host: serial / USB / TCP transports, the session rules, the standard interfaces, and a virtual bench"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -125,6 +125,17 @@ def main(argv=None) -> int:
|
|
|
125
125
|
rs.add_argument("--reopen-s", type=float, default=0.0, metavar="S",
|
|
126
126
|
help="when the probe is not back within its restart_max_ms, open it again for up to S more seconds "
|
|
127
127
|
"(your reopen: a host where the device returns late, e.g. WSL re-attaching it through usbipd)")
|
|
128
|
+
ca = sub.add_parser("call", help="run any interface's op: by number with the request as hex bytes, or by the name and "
|
|
129
|
+
"fields its describe gives (core §7.4 op_name / op_field)")
|
|
130
|
+
ca.add_argument("probe", help="a probe: oep://UNIT_ID[?via=...], a serial port, tcp://HOST:PORT or usb")
|
|
131
|
+
ca.add_argument("interface", help="the interface's name (io.github.you.thing); its fn is looked up")
|
|
132
|
+
ca.add_argument("op", help="the op: a number (0x10) or its name")
|
|
133
|
+
ca.add_argument("args", nargs="*", help="NAME=VALUE per field (integers 10 or 0x, bools true / false, lists 1,2,3, "
|
|
134
|
+
"bytes hex, text as it is), or the request as hex bytes")
|
|
135
|
+
ca.add_argument("--text", action="store_true", help="the request is ARGS joined by spaces, as UTF-8 bytes")
|
|
136
|
+
ca.add_argument("--wait", type=float, metavar="S", help="the op is a job (oep::SimpleInterface::job): wait up to S "
|
|
137
|
+
"seconds for it by the interface's status op, then show that")
|
|
138
|
+
ca.add_argument("--json", action="store_true")
|
|
128
139
|
fd = sub.add_parser("find", help="probes on the local network that announce _oep._tcp (DNS-SD over mDNS)")
|
|
129
140
|
fd.add_argument("--timeout", type=float, default=2.0, help="seconds to listen for answers (default 2)")
|
|
130
141
|
fd.add_argument("--engine", choices=("auto", "zeroconf", "minimal"), default="auto",
|
|
@@ -157,6 +168,8 @@ def main(argv=None) -> int:
|
|
|
157
168
|
return _restart_cmd(args)
|
|
158
169
|
if args.command == "find":
|
|
159
170
|
return _find_cmd(args)
|
|
171
|
+
if args.command == "call":
|
|
172
|
+
return _call_cmd(args)
|
|
160
173
|
|
|
161
174
|
confirm = (0, 1)
|
|
162
175
|
if args.virtual:
|
|
@@ -237,6 +250,82 @@ def _restart_cmd(args) -> int:
|
|
|
237
250
|
return 0
|
|
238
251
|
|
|
239
252
|
|
|
253
|
+
# ---- oep call -----------------------------------------------------------------------------------------------------
|
|
254
|
+
|
|
255
|
+
def _field_value(field, text: str):
|
|
256
|
+
from . import call as c
|
|
257
|
+
t = field.type
|
|
258
|
+
if t & c.LIST:
|
|
259
|
+
items = [x for x in text.replace(" ", "").split(",") if x]
|
|
260
|
+
return [(x.lower() in ("1", "true")) if (t & ~c.LIST) == c.T["bool"] else int(x, 0) for x in items]
|
|
261
|
+
if t == c.T["bool"]:
|
|
262
|
+
if text.lower() not in ("0", "1", "true", "false"):
|
|
263
|
+
raise SystemExit(f"oep call: {field.name} takes true or false")
|
|
264
|
+
return text.lower() in ("1", "true")
|
|
265
|
+
if t == c.T["bytes"]:
|
|
266
|
+
return bytes.fromhex(text)
|
|
267
|
+
if t == c.T["text"]:
|
|
268
|
+
return text
|
|
269
|
+
return int(text, 0)
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def _call_cmd(args) -> int:
|
|
273
|
+
import json
|
|
274
|
+
from . import call as c
|
|
275
|
+
hst = _open_host(args.probe)
|
|
276
|
+
try:
|
|
277
|
+
forms = c.ops(hst, args.interface)
|
|
278
|
+
except c.NotOffered as e:
|
|
279
|
+
raise SystemExit(f"oep call: {e}") from None
|
|
280
|
+
op: int | str = int(args.op, 0) if args.op[:1].isdigit() else args.op
|
|
281
|
+
form = forms.get(op) if isinstance(op, int) else next((f for f in forms.values() if f.name == op), None)
|
|
282
|
+
payload, fields = None, {}
|
|
283
|
+
if args.text:
|
|
284
|
+
payload = " ".join(args.args).encode()
|
|
285
|
+
elif form is not None and form.form and (any("=" in a for a in args.args) or not args.args):
|
|
286
|
+
by_name = {f.name: f for f in form.request}
|
|
287
|
+
for item in args.args:
|
|
288
|
+
name, eq, value = item.partition("=")
|
|
289
|
+
if not eq or name not in by_name:
|
|
290
|
+
raise SystemExit(f"oep call: {form.signature()}: give NAME=VALUE for its fields ({item!r})")
|
|
291
|
+
fields[name] = _field_value(by_name[name], value)
|
|
292
|
+
else:
|
|
293
|
+
try:
|
|
294
|
+
payload = bytes.fromhex("".join(args.args))
|
|
295
|
+
except ValueError:
|
|
296
|
+
raise SystemExit("oep call: the request as hex bytes (its describe gives this op no fields)") from None
|
|
297
|
+
if not (form is not None and form.lock_free):
|
|
298
|
+
core.take(hst, 10000 + int((args.wait or 0) * 1000), owner="oep call") # a job's wait inside the lease
|
|
299
|
+
try:
|
|
300
|
+
if args.wait is not None:
|
|
301
|
+
r = c.call_wait(hst, args.interface, op, payload, timeout=args.wait, **fields)
|
|
302
|
+
else:
|
|
303
|
+
r = c.call(hst, args.interface, op, payload, **fields)
|
|
304
|
+
except (c.JobFailed, c.JobCancelled, c.JobTimeout, c.ProbeRestarted) as e:
|
|
305
|
+
st = getattr(e, "status", {})
|
|
306
|
+
print(json.dumps({"result": type(e).__name__, "why": str(e), "status": st}, default=str) if args.json
|
|
307
|
+
else f"{type(e).__name__} {e}")
|
|
308
|
+
return 1
|
|
309
|
+
except TypeError as e:
|
|
310
|
+
raise SystemExit(f"oep call: {e}") from None
|
|
311
|
+
except c.NotOffered as e:
|
|
312
|
+
raise SystemExit(f"oep call: {e}") from None
|
|
313
|
+
except c.CommandFailed as e:
|
|
314
|
+
out = {"result": "failed", "op": e.op, "fields": e.fields, "payload": e.payload.hex()}
|
|
315
|
+
print(json.dumps(out, default=str) if args.json else f"failed {e}" + ("" if e.fields else f" {e.payload.hex()}"))
|
|
316
|
+
return 1
|
|
317
|
+
except c.CommandRejected as e:
|
|
318
|
+
print(json.dumps({"result": "rejected", "op": e.op, "why": str(e)}) if args.json else f"rejected {e}")
|
|
319
|
+
return 1
|
|
320
|
+
shown = {k: (v.hex() if isinstance(v, bytes) else v) for k, v in r.items()}
|
|
321
|
+
if args.json:
|
|
322
|
+
print(json.dumps({"result": "completed", "revision": r.revision, "fields": shown, "payload": r.payload.hex()}))
|
|
323
|
+
else:
|
|
324
|
+
body = " ".join(f"{k}={v}" for k, v in shown.items()) if shown or (form and form.form) else r.payload.hex()
|
|
325
|
+
print(f"completed rev {r.revision} {body}".rstrip())
|
|
326
|
+
return 0
|
|
327
|
+
|
|
328
|
+
|
|
240
329
|
# ---- oep pins -----------------------------------------------------------------------------------------------------
|
|
241
330
|
|
|
242
331
|
def _pins_cmd(args) -> int:
|
|
@@ -315,6 +315,19 @@ class CortexM:
|
|
|
315
315
|
raise h.OepError(f"stopped at {pc:#010x}, not at the return breakpoint")
|
|
316
316
|
return self.reg(0)
|
|
317
317
|
|
|
318
|
+
DEMCR, VC_CORERESET = 0xE000EDFC, 1
|
|
319
|
+
|
|
320
|
+
def reset_halt(self, timeout: float = 1.0) -> int:
|
|
321
|
+
"""Reset the core and stop it on its first instruction (DEMCR.VC_CORERESET through AIRCR.SYSRESETREQ), the
|
|
322
|
+
catch cleared again: a clean core to call ROM functions on (a core left locked up in a fault handler is not
|
|
323
|
+
one). C_MASKINTS is cleared first (it survives the reset). -> PC"""
|
|
324
|
+
self.mem.write32(self.DHCSR, self.KEY | self.C_DEBUGEN | self.C_HALT)
|
|
325
|
+
self.mem.write32(self.DEMCR, self.mem.read32(self.DEMCR) | self.VC_CORERESET)
|
|
326
|
+
self.mem.write32(self.AIRCR, 0x05FA0004)
|
|
327
|
+
self._wait(self.S_HALT, timeout)
|
|
328
|
+
self.mem.write32(self.DEMCR, self.mem.read32(self.DEMCR) & ~self.VC_CORERESET)
|
|
329
|
+
return self.reg(self.PC)
|
|
330
|
+
|
|
318
331
|
def sys_reset(self) -> None:
|
|
319
332
|
"""AIRCR.SYSRESETREQ: the core restarts; debug-domain state (DHCSR) survives, so clear the mask first."""
|
|
320
333
|
self.mem.write32(self.DHCSR, self.KEY | self.C_DEBUGEN | self.C_HALT)
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"""Call any interface's op by its number, or by the name and fields its describe gives (oep-core §7.4 op_name /
|
|
2
|
+
op_field) - an interface this host has no module for, such as a sketch's oep::SimpleInterface.
|
|
3
|
+
|
|
4
|
+
from oep_client import link, core
|
|
5
|
+
from oep_client.call import call
|
|
6
|
+
hst = link.open_host("/dev/ttyACM0")
|
|
7
|
+
core.take(hst, 10000, owner="my-test")
|
|
8
|
+
r = call(hst, "io.github.yourname.mine", "add", a=2, b=3)
|
|
9
|
+
r["sum"], r.sum, r.revision # the success fields by name; the interface's revision
|
|
10
|
+
call(hst, "io.github.yourname.mine", 0x10, b"\\x02\\0\\0\\0\\x03\\0\\0\\0").payload # by number, the bytes as they are
|
|
11
|
+
|
|
12
|
+
Errors: InterfaceMissing / RevisionMismatch / OpMissing (all NotOffered: a test can turn them into a skip),
|
|
13
|
+
CommandRejected (the probe refused it: the reason), CommandFailed (completed failed: code and message when the op
|
|
14
|
+
gives them).
|
|
15
|
+
|
|
16
|
+
A job (oep::SimpleInterface::job: it starts work on the probe's worker and answers at once) and its status op:
|
|
17
|
+
|
|
18
|
+
st = call_wait(hst, "io.github.yourname.mine", "collect", count=3, timeout=10)
|
|
19
|
+
st.start_ns, st.end_ns # on the probe's clock (a capture's markers' one)
|
|
20
|
+
# wait=: a stream's wait (acquire.Request(during=...)) keeps the capture collecting while this waits
|
|
21
|
+
|
|
22
|
+
JobFailed (the job's Worker::fail: code, message), JobCancelled, JobTimeout (cancel sent first), ProbeRestarted (its
|
|
23
|
+
boot_id changed while the job ran)."""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
import struct
|
|
28
|
+
import time
|
|
29
|
+
from typing import Any, Callable
|
|
30
|
+
|
|
31
|
+
from . import catalog, core, host as h
|
|
32
|
+
|
|
33
|
+
T = catalog.OP_FIELD_TYPES
|
|
34
|
+
LIST = catalog.OP_FIELD_LIST
|
|
35
|
+
_INT = {T["u8"]: "<B", T["u16"]: "<H", T["u32"]: "<I", T["u64"]: "<Q",
|
|
36
|
+
T["i8"]: "<b", T["i16"]: "<h", T["i32"]: "<i", T["i64"]: "<q", T["bool"]: "<B"}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class NotOffered(LookupError):
|
|
40
|
+
"""The probe does not offer what was asked: no such interface, another revision, no such op."""
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class InterfaceMissing(NotOffered):
|
|
44
|
+
pass
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class RevisionMismatch(NotOffered):
|
|
48
|
+
def __init__(self, interface: str, revision: int, wanted: int):
|
|
49
|
+
super().__init__(f"{interface} is revision {revision} on this probe, {wanted} asked")
|
|
50
|
+
self.revision, self.wanted = revision, wanted
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class OpMissing(NotOffered):
|
|
54
|
+
pass
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class CommandRejected(h.Rejected):
|
|
58
|
+
"""The probe refused the op (resolution rejected): `result.detail` is the reason (core §4.3)."""
|
|
59
|
+
|
|
60
|
+
def __init__(self, op: str, result):
|
|
61
|
+
super().__init__(result)
|
|
62
|
+
self.op = op
|
|
63
|
+
self.args = (f"{op}: {result.describe()}",)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class CommandFailed(h.Failed):
|
|
67
|
+
"""The op ran and did not work (completed failed / partial): `fields` the failed part decoded (code, message for
|
|
68
|
+
an oep::SimpleInterface op), `payload` the bytes."""
|
|
69
|
+
|
|
70
|
+
def __init__(self, op: str, result, fields: dict | None):
|
|
71
|
+
why = f"{op}: {result.describe()}"
|
|
72
|
+
if fields and "code" in fields:
|
|
73
|
+
why += f" (code {fields['code']}" + (f": {fields['message']}" if fields.get("message") else "") + ")"
|
|
74
|
+
super().__init__(result, why)
|
|
75
|
+
self.op, self.fields, self.payload = op, fields or {}, result.payload
|
|
76
|
+
self.code, self.message = self.fields.get("code"), self.fields.get("message")
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class JobFailed(h.OepError):
|
|
80
|
+
"""The job ended failed: `code` and `message` from its Worker::fail(), `status` the status op's fields."""
|
|
81
|
+
|
|
82
|
+
def __init__(self, op: str, status: dict):
|
|
83
|
+
super().__init__(f"{op}: failed (code {status.get('code')}"
|
|
84
|
+
+ (f": {status['message']}" if status.get("message") else "") + ")")
|
|
85
|
+
self.op, self.status, self.code, self.message = op, status, status.get("code"), status.get("message")
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class JobCancelled(h.OepError):
|
|
89
|
+
"""The job stopped on a cancel (`status` the status op's fields)."""
|
|
90
|
+
|
|
91
|
+
def __init__(self, op: str, status: dict):
|
|
92
|
+
super().__init__(f"{op}: cancelled")
|
|
93
|
+
self.op, self.status = op, status
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class JobTimeout(h.OepError, TimeoutError):
|
|
97
|
+
"""The job still ran at the timeout; a cancel was sent (`status` the last status op's fields)."""
|
|
98
|
+
|
|
99
|
+
def __init__(self, op: str, timeout: float, status: dict):
|
|
100
|
+
super().__init__(f"{op}: still running after {timeout} s (cancel sent)")
|
|
101
|
+
self.op, self.status = op, status
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class ProbeRestarted(h.OepError):
|
|
105
|
+
"""The probe's boot_id changed while the job ran (core §6.5): it restarted, the job with it."""
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
# The status op's state (oep::Worker::State): the firmware's convention, not the registry's
|
|
109
|
+
JOB_STATES = {"idle": 0, "running": 1, "done": 2, "failed": 3, "cancelled": 4}
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class CallResult(dict):
|
|
113
|
+
"""The success fields by name (a dict, and attributes), the raw payload, the interface's revision and the op."""
|
|
114
|
+
|
|
115
|
+
def __init__(self, fields: dict, payload: bytes, revision: int, op: catalog.OpForm | int):
|
|
116
|
+
super().__init__(fields)
|
|
117
|
+
self.payload, self.revision, self.op = payload, revision, op
|
|
118
|
+
|
|
119
|
+
def __getattr__(self, name: str) -> Any:
|
|
120
|
+
try:
|
|
121
|
+
return self[name]
|
|
122
|
+
except KeyError:
|
|
123
|
+
raise AttributeError(name) from None
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def encode(fields: list[catalog.OpField], values: dict) -> bytes:
|
|
127
|
+
"""A request's fixed part from values by field name (ints, bools, bytes, str, lists of ints / bools)."""
|
|
128
|
+
missing = [f.name for f in fields if f.name not in values]
|
|
129
|
+
extra = sorted(set(values) - {f.name for f in fields})
|
|
130
|
+
if missing or extra:
|
|
131
|
+
raise TypeError(f"fields {', '.join(f'{f.name}: {f.type_name}' for f in fields) or 'none'}"
|
|
132
|
+
+ (f"; missing {missing}" if missing else "") + (f"; not fields {extra}" if extra else ""))
|
|
133
|
+
out = b""
|
|
134
|
+
for f in fields:
|
|
135
|
+
v = values[f.name]
|
|
136
|
+
if f.type & LIST:
|
|
137
|
+
items = list(v)
|
|
138
|
+
out += struct.pack("<H", len(items)) + b"".join(struct.pack(_INT[f.type & ~LIST], int(x)) for x in items)
|
|
139
|
+
elif f.type == T["bytes"]:
|
|
140
|
+
b = bytes(v)
|
|
141
|
+
out += struct.pack("<H", len(b)) + b
|
|
142
|
+
elif f.type == T["text"]:
|
|
143
|
+
b = str(v).encode()
|
|
144
|
+
out += struct.pack("<H", len(b)) + b
|
|
145
|
+
elif f.type in _INT:
|
|
146
|
+
out += struct.pack(_INT[f.type], int(v))
|
|
147
|
+
else:
|
|
148
|
+
raise TypeError(f"{f.name}: type {f.type} unknown to this host")
|
|
149
|
+
return out
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def decode(fields: list[catalog.OpField], payload: bytes) -> tuple[dict, bytes]:
|
|
153
|
+
"""A fixed part's fields by name, and what follows them (the TLVs)."""
|
|
154
|
+
out, at = {}, 0
|
|
155
|
+
for f in fields:
|
|
156
|
+
if f.type & LIST:
|
|
157
|
+
(n,) = struct.unpack_from("<H", payload, at)
|
|
158
|
+
fmt = _INT[f.type & ~LIST]
|
|
159
|
+
w = struct.calcsize(fmt)
|
|
160
|
+
vals = [struct.unpack_from(fmt, payload, at + 2 + i * w)[0] for i in range(n)]
|
|
161
|
+
out[f.name] = [bool(x) for x in vals] if (f.type & ~LIST) == T["bool"] else vals
|
|
162
|
+
at += 2 + n * w
|
|
163
|
+
elif f.type in (T["bytes"], T["text"]):
|
|
164
|
+
(n,) = struct.unpack_from("<H", payload, at)
|
|
165
|
+
if at + 2 + n > len(payload):
|
|
166
|
+
raise h.ShortPayload(f"{f.name}: {n} bytes, the answer ends before")
|
|
167
|
+
raw = payload[at + 2:at + 2 + n]
|
|
168
|
+
out[f.name] = raw.decode("utf-8", "replace") if f.type == T["text"] else raw
|
|
169
|
+
at += 2 + n
|
|
170
|
+
else:
|
|
171
|
+
fmt = _INT[f.type]
|
|
172
|
+
out[f.name] = struct.unpack_from(fmt, payload, at)[0]
|
|
173
|
+
if f.type == T["bool"]:
|
|
174
|
+
out[f.name] = bool(out[f.name])
|
|
175
|
+
at += struct.calcsize(fmt)
|
|
176
|
+
return out, payload[at:]
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def ops(hst: h.Host, interface: str | int) -> dict[int, catalog.OpForm]:
|
|
180
|
+
"""The op_name / op_field an interface's describe gives (by op number; empty when it gives none)."""
|
|
181
|
+
fn = interface if isinstance(interface, int) else _fn(hst, interface)
|
|
182
|
+
return catalog.decode_description(b"".join(catalog.tlv(t, v) for t, v in core.describe(hst, fn))).op_forms
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
def _fn(hst: h.Host, interface: str) -> int:
|
|
186
|
+
try:
|
|
187
|
+
return core.find(hst, interface)
|
|
188
|
+
except LookupError as e:
|
|
189
|
+
raise InterfaceMissing(str(e)) from None
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def call(hst: h.Host, interface: str, op: int | str, payload: bytes | None = None, *, locked: bool | None = None,
|
|
193
|
+
revision: int | None = None, expect_ms: int = 0, **fields) -> CallResult:
|
|
194
|
+
"""Run `op` (a number, or a name from the describe's op_name) of `interface` on the session `hst` holds.
|
|
195
|
+
payload: the request as bytes (then no fields); otherwise the fields by name, packed as op_field says.
|
|
196
|
+
locked: send it in the session (default: unless op_name says lock_free). revision: the one expected."""
|
|
197
|
+
fn = _fn(hst, interface)
|
|
198
|
+
rev = core.revision(hst, interface, fn)
|
|
199
|
+
if revision is not None and rev != revision:
|
|
200
|
+
raise RevisionMismatch(interface, rev, revision)
|
|
201
|
+
forms = ops(hst, fn)
|
|
202
|
+
if isinstance(op, str):
|
|
203
|
+
form = next((f for f in forms.values() if f.name == op), None)
|
|
204
|
+
if form is None:
|
|
205
|
+
raise OpMissing(f"{interface} has no op named {op!r}" + (f" (it names {', '.join(f.name for f in forms.values())})"
|
|
206
|
+
if forms else " (its describe names none)"))
|
|
207
|
+
code = form.op
|
|
208
|
+
else:
|
|
209
|
+
code, form = op, forms.get(op)
|
|
210
|
+
label = form.name if form else f"0x{code:02x}"
|
|
211
|
+
if not core.offers(hst, fn, code):
|
|
212
|
+
raise OpMissing(f"{interface} does not offer op {label}")
|
|
213
|
+
if payload is None:
|
|
214
|
+
if fields:
|
|
215
|
+
if form is None or not form.form:
|
|
216
|
+
raise TypeError(f"{interface} {label}: its describe gives no fields; pass payload= as bytes")
|
|
217
|
+
payload = encode(form.request, fields)
|
|
218
|
+
elif form is not None and form.form and form.request:
|
|
219
|
+
payload = encode(form.request, fields) # raises: the fields it needs
|
|
220
|
+
else:
|
|
221
|
+
payload = b""
|
|
222
|
+
elif fields:
|
|
223
|
+
raise TypeError("payload= or fields, not both")
|
|
224
|
+
if locked is None:
|
|
225
|
+
locked = not (form is not None and form.lock_free)
|
|
226
|
+
try:
|
|
227
|
+
r = hst.request(fn, code, payload, locked=locked, expect_ms=expect_ms)
|
|
228
|
+
except h.Rejected as e:
|
|
229
|
+
raise CommandRejected(label, e.result) from None
|
|
230
|
+
if r.succeeded:
|
|
231
|
+
got = decode(form.success, r.payload)[0] if form is not None and form.form else {}
|
|
232
|
+
return CallResult(got, r.payload, rev, form or code)
|
|
233
|
+
failed = None
|
|
234
|
+
if r.ran and form is not None and form.form and form.failed:
|
|
235
|
+
try:
|
|
236
|
+
failed = decode(form.failed, r.payload)[0]
|
|
237
|
+
except (struct.error, h.ShortPayload):
|
|
238
|
+
failed = None # a failed answer without its fields (a firmware bug)
|
|
239
|
+
raise CommandFailed(label, r, failed)
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
def call_wait(hst: h.Host, interface: str, op: int | str, payload: bytes | None = None, *, timeout: float,
|
|
243
|
+
wait: Callable[[float], None] | None = None, interval: float = 0.05, status: str = "status",
|
|
244
|
+
cancel: str = "cancel", revision: int | None = None, **fields) -> CallResult:
|
|
245
|
+
"""Start the job `op` (as call()) and wait for it by its `status` op: the status's fields when it ended done.
|
|
246
|
+
wait(seconds) sleeps between the status reads (time.sleep by default; a stream's wait keeps a capture going)."""
|
|
247
|
+
boot = hst.clock().boot_id
|
|
248
|
+
started = call(hst, interface, op, payload, revision=revision, **fields)
|
|
249
|
+
code = started.op.op if isinstance(started.op, catalog.OpForm) else started.op
|
|
250
|
+
label = started.op.name if isinstance(started.op, catalog.OpForm) else f"0x{code:02x}"
|
|
251
|
+
pause = wait or time.sleep
|
|
252
|
+
deadline = time.monotonic() + timeout
|
|
253
|
+
while True:
|
|
254
|
+
try:
|
|
255
|
+
st = call(hst, interface, status)
|
|
256
|
+
except (h.OepError, OSError):
|
|
257
|
+
_restarted(hst, boot, label)
|
|
258
|
+
raise
|
|
259
|
+
if st["op"] != code or st["state"] == JOB_STATES["idle"]:
|
|
260
|
+
_restarted(hst, boot, label)
|
|
261
|
+
raise ProbeRestarted(f"{label}: the status names op {st['op']} in state {st['state']}, not this job")
|
|
262
|
+
if st["state"] != JOB_STATES["running"]:
|
|
263
|
+
break
|
|
264
|
+
if time.monotonic() >= deadline:
|
|
265
|
+
try:
|
|
266
|
+
call(hst, interface, cancel)
|
|
267
|
+
except (h.OepError, OSError):
|
|
268
|
+
pass # the timeout is the error to report
|
|
269
|
+
raise JobTimeout(label, timeout, dict(st))
|
|
270
|
+
pause(interval)
|
|
271
|
+
if st["state"] == JOB_STATES["failed"]:
|
|
272
|
+
raise JobFailed(label, dict(st))
|
|
273
|
+
if st["state"] == JOB_STATES["cancelled"]:
|
|
274
|
+
raise JobCancelled(label, dict(st))
|
|
275
|
+
return st
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
def _restarted(hst: h.Host, boot: int, label: str) -> None:
|
|
279
|
+
try:
|
|
280
|
+
now = hst.clock().boot_id
|
|
281
|
+
except (h.OepError, OSError):
|
|
282
|
+
return
|
|
283
|
+
if now != boot:
|
|
284
|
+
raise ProbeRestarted(f"{label}: the probe restarted while the job ran (boot_id {boot:#x} -> {now:#x})")
|
|
@@ -32,6 +32,13 @@ MIN_CLOCK_HZ = _COMMON["min_clock_hz"] # u32
|
|
|
32
32
|
FEATURES = _COMMON["features"] # u32, bits defined by the interface
|
|
33
33
|
CHANNEL_GROUP = _COMMON["channel_group"] # group(u8) n(u8) then n x (role(u8), channel(u16)): a fixed pin set
|
|
34
34
|
OPS = _COMMON["ops"] # base(u8) bitmap: the ops this fn offers (core §1.2, §7.4)
|
|
35
|
+
OP_NAME = _COMMON["op_name"] # op(u8) flags(u8) name: an op's name (core §7.4, optional)
|
|
36
|
+
OP_FIELD = _COMMON["op_field"] # op(u8) part(u8) type(u8) name: one field of an op's fixed part (core §7.4)
|
|
37
|
+
OP_NAME_FORM = reg.CORE.enum["op_name_flag"]["form"]
|
|
38
|
+
OP_NAME_LOCK_FREE = reg.CORE.enum["op_name_flag"]["lock_free"]
|
|
39
|
+
OP_FIELD_PARTS = reg.CORE.enum["op_field_part"] # request / success / failed
|
|
40
|
+
OP_FIELD_TYPES = reg.CORE.enum["op_field_type"] # u8 ... text, and the list bit
|
|
41
|
+
OP_FIELD_LIST = OP_FIELD_TYPES["list"]
|
|
35
42
|
assert OPS == m.TAG_OPS
|
|
36
43
|
CRITICAL = 0x80
|
|
37
44
|
INTERFACE_TAG_FIRST = 0x40
|
|
@@ -197,6 +204,50 @@ def text(tag: int, s: str) -> bytes:
|
|
|
197
204
|
return tlv(tag, s.encode("ascii"))
|
|
198
205
|
|
|
199
206
|
|
|
207
|
+
class OpField:
|
|
208
|
+
"""One field of an op's fixed part (core §7.4 op_field): its name and type (registry op_field_type)."""
|
|
209
|
+
|
|
210
|
+
def __init__(self, name: str, type: int):
|
|
211
|
+
self.name, self.type = name, type
|
|
212
|
+
|
|
213
|
+
@property
|
|
214
|
+
def type_name(self) -> str:
|
|
215
|
+
names = {v: k for k, v in OP_FIELD_TYPES.items() if k != "list"}
|
|
216
|
+
base = self.type & ~OP_FIELD_LIST
|
|
217
|
+
label = names.get(base, f"type{base}")
|
|
218
|
+
return label + "[]" if self.type & OP_FIELD_LIST else label
|
|
219
|
+
|
|
220
|
+
def __repr__(self) -> str:
|
|
221
|
+
return f"{self.name}: {self.type_name}"
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
@dataclass
|
|
225
|
+
class OpForm:
|
|
226
|
+
"""An op's name and, with form, its request / success / failed fixed parts' fields (core §7.4)."""
|
|
227
|
+
|
|
228
|
+
op: int
|
|
229
|
+
name: str
|
|
230
|
+
flags: int
|
|
231
|
+
request: list[OpField] = field(default_factory=list)
|
|
232
|
+
success: list[OpField] = field(default_factory=list)
|
|
233
|
+
failed: list[OpField] = field(default_factory=list)
|
|
234
|
+
|
|
235
|
+
@property
|
|
236
|
+
def form(self) -> bool:
|
|
237
|
+
return bool(self.flags & OP_NAME_FORM)
|
|
238
|
+
|
|
239
|
+
@property
|
|
240
|
+
def lock_free(self) -> bool:
|
|
241
|
+
return bool(self.flags & OP_NAME_LOCK_FREE)
|
|
242
|
+
|
|
243
|
+
def signature(self) -> str:
|
|
244
|
+
"""measure(mode: u8) -> temp: i32, hum: u32 (the name alone without form)"""
|
|
245
|
+
if not self.form:
|
|
246
|
+
return self.name
|
|
247
|
+
s = f"{self.name}({', '.join(map(repr, self.request))})"
|
|
248
|
+
return s + (" -> " + ", ".join(map(repr, self.success)) if self.success else "")
|
|
249
|
+
|
|
250
|
+
|
|
200
251
|
@dataclass
|
|
201
252
|
class Description:
|
|
202
253
|
"""Common tags decoded; interface-specific and unknown tags kept raw, in order."""
|
|
@@ -212,11 +263,13 @@ class Description:
|
|
|
212
263
|
specific: list[tuple[int, bytes]] = field(default_factory=list)
|
|
213
264
|
unknown_critical: list[int] = field(default_factory=list)
|
|
214
265
|
broken: list[int] = field(default_factory=list) # common tags whose value is not their defined length (not used)
|
|
266
|
+
op_forms: dict[int, OpForm] = field(default_factory=dict) # op -> its op_name / op_field (core §7.4)
|
|
215
267
|
|
|
216
268
|
|
|
217
269
|
def decode_description(data: bytes) -> Description:
|
|
218
270
|
d = Description()
|
|
219
271
|
seen: set[int] = set()
|
|
272
|
+
fields: list[tuple[int, int, int, str]] = [] # op_field (op, part, type, name), in the describe's order
|
|
220
273
|
for tag, value in split_tlv(data):
|
|
221
274
|
if tag & CRITICAL:
|
|
222
275
|
continue # bit 7 in an answer: an unknown tag, skipped (core §2.2)
|
|
@@ -248,11 +301,28 @@ def decode_description(data: bytes) -> Description:
|
|
|
248
301
|
d.ops_invalid = why
|
|
249
302
|
else:
|
|
250
303
|
d.ops = unpack_ops(value)
|
|
304
|
+
elif t == OP_NAME:
|
|
305
|
+
if len(value) < 3:
|
|
306
|
+
d.broken.append(tag)
|
|
307
|
+
continue
|
|
308
|
+
if value[0] in d.op_forms:
|
|
309
|
+
continue # a second op_name for an op: the first is used
|
|
310
|
+
d.op_forms[value[0]] = OpForm(value[0], value[2:].decode("ascii", "replace"), value[1])
|
|
311
|
+
elif t == OP_FIELD:
|
|
312
|
+
if len(value) < 4:
|
|
313
|
+
d.broken.append(tag)
|
|
314
|
+
continue
|
|
315
|
+
fields.append((value[0], value[1], value[2], value[3:].decode("ascii", "replace")))
|
|
251
316
|
elif t >= INTERFACE_TAG_FIRST:
|
|
252
317
|
d.specific.append((tag, value))
|
|
253
318
|
elif tag & CRITICAL:
|
|
254
319
|
d.unknown_critical.append(tag)
|
|
255
320
|
# an unknown non-critical common tag is skipped
|
|
321
|
+
parts = {OP_FIELD_PARTS["request"]: "request", OP_FIELD_PARTS["success"]: "success", OP_FIELD_PARTS["failed"]: "failed"}
|
|
322
|
+
for op, part, type_, name in fields: # only an op named with form takes its fields
|
|
323
|
+
form = d.op_forms.get(op)
|
|
324
|
+
if form is not None and form.form and part in parts:
|
|
325
|
+
getattr(form, parts[part]).append(OpField(name, type_))
|
|
256
326
|
for role in d.roles:
|
|
257
327
|
d.roles[role] = sorted(set(d.roles[role]))
|
|
258
328
|
if d.ops_invalid:
|
{oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/__init__.py
RENAMED
|
@@ -145,7 +145,7 @@ def checker_sources_sha256():
|
|
|
145
145
|
for name in CHECKER_SOURCES}
|
|
146
146
|
|
|
147
147
|
|
|
148
|
-
REVIEWED_CORE_SHA256 = '
|
|
148
|
+
REVIEWED_CORE_SHA256 = '81cffc532f2626812b109d0aa5eef81636799011f410a8bc2fb9ea520fcbf4bc' # oep-spec docs/oep-core.ja.md
|
|
149
149
|
|
|
150
150
|
|
|
151
151
|
def require_reviewed_contract(registry, spec=None):
|
{oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/core_smoke.py
RENAMED
|
@@ -8,7 +8,7 @@ import struct
|
|
|
8
8
|
from . import ops, require, tlvs
|
|
9
9
|
from .. import conformance as _helpers
|
|
10
10
|
|
|
11
|
-
REVIEWED_CORE_SHA256 = '
|
|
11
|
+
REVIEWED_CORE_SHA256 = '81cffc532f2626812b109d0aa5eef81636799011f410a8bc2fb9ea520fcbf4bc' # oep-spec docs/oep-core.ja.md
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class CoreSmokeChecks:
|
{oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/host_core.py
RENAMED
|
@@ -4,7 +4,7 @@ from pathlib import Path
|
|
|
4
4
|
import struct
|
|
5
5
|
from . import require,spec_identity
|
|
6
6
|
|
|
7
|
-
REVIEWED_CORE_SHA256='
|
|
7
|
+
REVIEWED_CORE_SHA256='81cffc532f2626812b109d0aa5eef81636799011f410a8bc2fb9ea520fcbf4bc'
|
|
8
8
|
CORE_OPS={'confirm':1,'list':2,'describe':3,'clock':4,'open':16,'end':17,'keepalive':18,'lock_state':19}
|
|
9
9
|
# the settings' ops (core §13.5 / §13.7, transports §7.3): their numbers reviewed, their results not read here
|
|
10
10
|
SETTINGS_OPS={'get':32,'set':33,'unset':34,'save':35,'state':36,'network':37}
|
{oep_client_python-0.0.52 → oep_client_python-0.0.54}/src/oep_client/conformance/host_deadline.py
RENAMED
|
@@ -9,8 +9,8 @@ from pathlib import Path
|
|
|
9
9
|
from . import require,spec_identity
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
REVIEWED={'docs/oep-core.ja.md':'
|
|
13
|
-
'docs/oep-transports.ja.md':'
|
|
12
|
+
REVIEWED={'docs/oep-core.ja.md':'81cffc532f2626812b109d0aa5eef81636799011f410a8bc2fb9ea520fcbf4bc',
|
|
13
|
+
'docs/oep-transports.ja.md':'a22754ee25997058be0e698bd62ea132537627914f38a06caffd48e3d79f096e'}
|
|
14
14
|
QUICK_MS=1000 # core_quick_op_max_ms
|
|
15
15
|
|
|
16
16
|
|