oep-client-python 0.0.53__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.
Files changed (736) hide show
  1. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/CHANGELOG.md +28 -0
  2. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/PKG-INFO +1 -1
  3. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/pyproject.toml +1 -1
  4. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/__init__.py +1 -1
  5. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/__main__.py +89 -0
  6. oep_client_python-0.0.54/src/oep_client/call.py +284 -0
  7. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/catalog.py +70 -0
  8. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/__init__.py +1 -1
  9. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/core_smoke.py +1 -1
  10. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/host_core.py +1 -1
  11. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/host_deadline.py +2 -2
  12. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/host_requests.py +2 -2
  13. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/host_wait.py +2 -2
  14. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/dump.py +7 -1
  15. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/registry.py +5 -5
  16. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/virtual_bench.py +14 -2
  17. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/spec/DOCS_SHA256 +2 -2
  18. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/spec/oep-v1.toml +25 -1
  19. oep_client_python-0.0.54/tests/test_call.py +234 -0
  20. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_trace_core.py +6 -3
  21. oep_client_python-0.0.54/tests/vectors/SPEC_COMMIT +1 -0
  22. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/vectors/SPEC_SHA256 +4 -4
  23. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/vectors/ops.json +35 -35
  24. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/vectors/settings_file.json +2 -2
  25. oep_client_python-0.0.53/tests/vectors/SPEC_COMMIT +0 -1
  26. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/.gitignore +0 -0
  27. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/LICENSE +0 -0
  28. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/README.ja.md +0 -0
  29. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/README.md +0 -0
  30. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/README.ja.md +0 -0
  31. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/allocator-conformance.ja.md +0 -0
  32. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/analog-conformance.ja.md +0 -0
  33. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/analog-payload-conformance.ja.md +0 -0
  34. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/arm-adi-conformance.ja.md +0 -0
  35. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/attach-conformance.ja.md +0 -0
  36. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/block-conformance.ja.md +0 -0
  37. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/capture-group-conformance.ja.md +0 -0
  38. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/capture-group-geometry-conformance.ja.md +0 -0
  39. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/capture-metadata-conformance.ja.md +0 -0
  40. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/capture-serial-conformance.ja.md +0 -0
  41. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/capture-timeline-conformance.ja.md +0 -0
  42. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/capture-timeline-lifecycle-conformance.ja.md +0 -0
  43. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/clock-conformance.ja.md +0 -0
  44. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/config-conformance.ja.md +0 -0
  45. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/config-execution-conformance.ja.md +0 -0
  46. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/config-fallback-conformance.ja.md +0 -0
  47. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/config-paging-conformance.ja.md +0 -0
  48. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/config-power-loss-conformance.ja.md +0 -0
  49. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/config-storage-conformance.ja.md +0 -0
  50. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/conformance-checks.ja.md +0 -0
  51. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/conformance-spec-compatibility.ja.md +0 -0
  52. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/core-fixed-fields-review.ja.md +0 -0
  53. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/core-smoke-conformance.ja.md +0 -0
  54. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/corr-conformance.ja.md +0 -0
  55. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/cut-conformance.ja.md +0 -0
  56. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/data-conformance.ja.md +0 -0
  57. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/debug-conformance.ja.md +0 -0
  58. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/dependency-conformance.ja.md +0 -0
  59. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/discovery-conformance.ja.md +0 -0
  60. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/dmseq-conformance.ja.md +0 -0
  61. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/dmseq-target-conformance.ja.md +0 -0
  62. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/execution-order-conformance.ja.md +0 -0
  63. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/exhausted-conformance.ja.md +0 -0
  64. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/fixture-metadata-conformance.ja.md +0 -0
  65. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/gpio-conformance.ja.md +0 -0
  66. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/gpio-lifecycle-conformance.ja.md +0 -0
  67. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/hardware-configuration.ja.md +0 -0
  68. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/hardware-quickstart.ja.md +0 -0
  69. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/hardware-schema.ja.md +0 -0
  70. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/host-core-shapes-conformance.ja.md +0 -0
  71. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/host-deadline-conformance.ja.md +0 -0
  72. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/host-notification-conformance.ja.md +0 -0
  73. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/host-request-conformance.ja.md +0 -0
  74. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/host-resend-conformance.ja.md +0 -0
  75. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/host-tlv-conformance.ja.md +0 -0
  76. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/host-value-conformance.ja.md +0 -0
  77. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/host-wait-conformance.ja.md +0 -0
  78. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/i2c-conformance.ja.md +0 -0
  79. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/interface-conformance.ja.md +0 -0
  80. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/interface-smoke-conformance.ja.md +0 -0
  81. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/lease-conformance.ja.md +0 -0
  82. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/link-routes-conformance.ja.md +0 -0
  83. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/link-transfer-conformance.ja.md +0 -0
  84. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/logic-conformance.ja.md +0 -0
  85. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/mailbox-conformance.ja.md +0 -0
  86. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/notification-output-sample.ja.md +0 -0
  87. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/notification-retention-conformance.ja.md +0 -0
  88. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/notification-sequence-conformance.ja.md +0 -0
  89. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/oep-declaration-conformance.ja.md +0 -0
  90. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/oep-example-smoke-conformance.ja.md +0 -0
  91. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/outcome-conformance.ja.md +0 -0
  92. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/pin-constraints-conformance.ja.md +0 -0
  93. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/pipeline-conformance.ja.md +0 -0
  94. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/port-speed-conformance.ja.md +0 -0
  95. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/probe-input-conformance.ja.md +0 -0
  96. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/recovery-conformance.ja.md +0 -0
  97. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/recovery-races-conformance.ja.md +0 -0
  98. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/refusal-order-conformance.ja.md +0 -0
  99. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/registered-ops-conformance.ja.md +0 -0
  100. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/replay-pressure-conformance.ja.md +0 -0
  101. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/reset-conformance.ja.md +0 -0
  102. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/resource-conformance.ja.md +0 -0
  103. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/response-race-conformance.ja.md +0 -0
  104. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/restart-conformance.ja.md +0 -0
  105. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/retention-conformance.ja.md +0 -0
  106. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/retention-lifecycle-conformance.ja.md +0 -0
  107. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/retry-conformance.ja.md +0 -0
  108. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/route-conformance.ja.md +0 -0
  109. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/run-conformance.ja.md +0 -0
  110. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/scan-conformance.ja.md +0 -0
  111. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/scan-options-conformance.ja.md +0 -0
  112. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/selected-metadata-conformance.ja.md +0 -0
  113. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/session-loss-conformance.ja.md +0 -0
  114. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/session-smoke-conformance.ja.md +0 -0
  115. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/spec-follow-notes.ja.md +0 -0
  116. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/spi-conformance.ja.md +0 -0
  117. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/step-conformance.ja.md +0 -0
  118. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/stream-conformance.ja.md +0 -0
  119. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/subscription-conformance.ja.md +0 -0
  120. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/tcp-recovery-conformance.ja.md +0 -0
  121. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/testing-consumers.ja.md +0 -0
  122. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/testing-policy.ja.md +0 -0
  123. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/tlv-request-conformance.ja.md +0 -0
  124. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/trace/README.ja.md +0 -0
  125. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/trace/capture.json +0 -0
  126. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/trace/common.json +0 -0
  127. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/trace/console.json +0 -0
  128. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/trace/core.json +0 -0
  129. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/trace/debug.json +0 -0
  130. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/trace/fixture.json +0 -0
  131. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/trace/link.json +0 -0
  132. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/trace/plan.json +0 -0
  133. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/trace/restart.json +0 -0
  134. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/trace/transports.json +0 -0
  135. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/uart-conformance.ja.md +0 -0
  136. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/uart-stream-conformance.ja.md +0 -0
  137. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/usb-conformance.ja.md +0 -0
  138. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/wire-options-conformance.ja.md +0 -0
  139. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/docs/writer-lease-conformance.ja.md +0 -0
  140. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/acquire.py +0 -0
  141. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/arm.py +0 -0
  142. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/capture.py +0 -0
  143. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/capture_blocks.py +0 -0
  144. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/ch32_flash.py +0 -0
  145. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/cobs.py +0 -0
  146. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/allocator.py +0 -0
  147. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/allocator_model.py +0 -0
  148. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/allocator_sample.py +0 -0
  149. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/analog.py +0 -0
  150. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/analog_model.py +0 -0
  151. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/analog_payload.py +0 -0
  152. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/analog_sample.py +0 -0
  153. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/arm_adi.py +0 -0
  154. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/arm_adi_blocks.py +0 -0
  155. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/arm_adi_model.py +0 -0
  156. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/arm_adi_sample.py +0 -0
  157. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/attach.py +0 -0
  158. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/attach_model.py +0 -0
  159. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/attach_sample.py +0 -0
  160. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/block_model.py +0 -0
  161. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/block_sample.py +0 -0
  162. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/blocks.py +0 -0
  163. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_group.py +0 -0
  164. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_group_geometry.py +0 -0
  165. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_group_geometry_model.py +0 -0
  166. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_group_model.py +0 -0
  167. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_group_sample.py +0 -0
  168. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_metadata.py +0 -0
  169. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_metadata_model.py +0 -0
  170. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_serial.py +0 -0
  171. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_serial_sample.py +0 -0
  172. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_timeline.py +0 -0
  173. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_timeline_lifecycle.py +0 -0
  174. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_timeline_model.py +0 -0
  175. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/capture_timeline_sample.py +0 -0
  176. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/clock.py +0 -0
  177. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/clock_model.py +0 -0
  178. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/clock_sample.py +0 -0
  179. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/core_fixed_fields.py +0 -0
  180. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/corr.py +0 -0
  181. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/cut.py +0 -0
  182. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/cut_model.py +0 -0
  183. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/cut_sample.py +0 -0
  184. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/data.py +0 -0
  185. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/data_model.py +0 -0
  186. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/data_sample.py +0 -0
  187. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/debug.py +0 -0
  188. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/debug_model.py +0 -0
  189. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/debug_sample.py +0 -0
  190. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/declaration_model.py +0 -0
  191. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/dependencies.py +0 -0
  192. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/dependency_model.py +0 -0
  193. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/dependency_sample.py +0 -0
  194. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/discovery.py +0 -0
  195. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/dmseq.py +0 -0
  196. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/dmseq_model.py +0 -0
  197. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/dmseq_sample.py +0 -0
  198. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/dmseq_target.py +0 -0
  199. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/dmseq_target_model.py +0 -0
  200. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/dmseq_target_sample.py +0 -0
  201. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/execution_order.py +0 -0
  202. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/execution_order_sample.py +0 -0
  203. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/exhausted.py +0 -0
  204. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/exhausted_sample.py +0 -0
  205. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/fixture_metadata.py +0 -0
  206. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/fixture_metadata_model.py +0 -0
  207. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/force_hw.py +0 -0
  208. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/gpio.py +0 -0
  209. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/gpio_lifecycle.py +0 -0
  210. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/gpio_lifecycle_model.py +0 -0
  211. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/gpio_lifecycle_sample.py +0 -0
  212. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/gpio_model.py +0 -0
  213. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/gpio_sample.py +0 -0
  214. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/host_core_sample.py +0 -0
  215. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/host_deadline_sample.py +0 -0
  216. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/host_notifications.py +0 -0
  217. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/host_notifications_sample.py +0 -0
  218. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/host_request_sample.py +0 -0
  219. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/host_resend.py +0 -0
  220. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/host_resend_sample.py +0 -0
  221. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/host_tlv.py +0 -0
  222. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/host_tlv_sample.py +0 -0
  223. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/host_values.py +0 -0
  224. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/host_values_sample.py +0 -0
  225. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/host_wait_sample.py +0 -0
  226. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/i2c.py +0 -0
  227. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/i2c_model.py +0 -0
  228. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/i2c_sample.py +0 -0
  229. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/interface_smoke.py +0 -0
  230. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/interfaces.py +0 -0
  231. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/lease.py +0 -0
  232. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/lease_sample.py +0 -0
  233. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/link_routes.py +0 -0
  234. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/link_routes_model.py +0 -0
  235. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/link_routes_sample.py +0 -0
  236. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/link_transfer_model.py +0 -0
  237. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/link_transfer_sample.py +0 -0
  238. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/link_transfers.py +0 -0
  239. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/logic.py +0 -0
  240. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/logic_model.py +0 -0
  241. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/logic_sample.py +0 -0
  242. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/mailbox.py +0 -0
  243. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/mailbox_model.py +0 -0
  244. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/mailbox_sample.py +0 -0
  245. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/notification_model.py +0 -0
  246. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/notification_retention.py +0 -0
  247. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/notification_retention_sample.py +0 -0
  248. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/notification_sequence.py +0 -0
  249. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/notification_sequence_sample.py +0 -0
  250. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/notify_hw.py +0 -0
  251. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/oep_declaration_model.py +0 -0
  252. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/oep_declarations.py +0 -0
  253. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/oep_smoke.py +0 -0
  254. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/outcome_model.py +0 -0
  255. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/outcome_sample.py +0 -0
  256. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/outcomes.py +0 -0
  257. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/pipeline.py +0 -0
  258. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/pipeline_model.py +0 -0
  259. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/pipeline_sample.py +0 -0
  260. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/port_speed.py +0 -0
  261. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/port_speed_execution.py +0 -0
  262. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/port_speed_execution_model.py +0 -0
  263. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/port_speed_execution_sample.py +0 -0
  264. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/port_speed_lifecycle.py +0 -0
  265. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/port_speed_model.py +0 -0
  266. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/port_speed_sample.py +0 -0
  267. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/probe_input.py +0 -0
  268. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/probe_input_sample.py +0 -0
  269. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/recovery.py +0 -0
  270. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/recovery_race_sample.py +0 -0
  271. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/recovery_races.py +0 -0
  272. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/recovery_sample.py +0 -0
  273. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/refusal_order.py +0 -0
  274. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/refusal_order_sample.py +0 -0
  275. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/registered_ops.py +0 -0
  276. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/registered_ops_model.py +0 -0
  277. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/release_hw.py +0 -0
  278. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/replay_pressure.py +0 -0
  279. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/reset.py +0 -0
  280. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/reset_model.py +0 -0
  281. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/reset_sample.py +0 -0
  282. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/resource_model.py +0 -0
  283. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/resource_sample.py +0 -0
  284. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/resources.py +0 -0
  285. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/response_race.py +0 -0
  286. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/response_race_sample.py +0 -0
  287. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/restart.py +0 -0
  288. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/restart_model.py +0 -0
  289. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/restart_sample.py +0 -0
  290. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/retention.py +0 -0
  291. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/retention_lifecycle.py +0 -0
  292. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/retention_lifecycle_sample.py +0 -0
  293. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/retention_model.py +0 -0
  294. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/retention_sample.py +0 -0
  295. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/retry.py +0 -0
  296. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/retry_model.py +0 -0
  297. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/retry_sample.py +0 -0
  298. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/route_model.py +0 -0
  299. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/route_sample.py +0 -0
  300. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/routes.py +0 -0
  301. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/run.py +0 -0
  302. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/run_model.py +0 -0
  303. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/run_sample.py +0 -0
  304. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/scan.py +0 -0
  305. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/scan_model.py +0 -0
  306. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/scan_options.py +0 -0
  307. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/scan_options_model.py +0 -0
  308. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/scan_options_sample.py +0 -0
  309. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/scan_sample.py +0 -0
  310. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/selected_metadata.py +0 -0
  311. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/selected_metadata_model.py +0 -0
  312. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/serial.py +0 -0
  313. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/session_loss.py +0 -0
  314. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/session_loss_sample.py +0 -0
  315. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/session_smoke.py +0 -0
  316. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/spi.py +0 -0
  317. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/spi_model.py +0 -0
  318. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/spi_sample.py +0 -0
  319. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/step.py +0 -0
  320. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/step_model.py +0 -0
  321. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/step_sample.py +0 -0
  322. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/stream.py +0 -0
  323. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/stream_model.py +0 -0
  324. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/stream_sample.py +0 -0
  325. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/subscription_sample.py +0 -0
  326. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/subscriptions.py +0 -0
  327. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/tcp.py +0 -0
  328. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/tcp_peers.py +0 -0
  329. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/tcp_recovery.py +0 -0
  330. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/tcp_recovery_sample.py +0 -0
  331. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/tlv_request_model.py +0 -0
  332. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/tlv_requests.py +0 -0
  333. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/uart.py +0 -0
  334. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/uart_model.py +0 -0
  335. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/uart_sample.py +0 -0
  336. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/uart_stream.py +0 -0
  337. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/uart_stream_sample.py +0 -0
  338. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/usb.py +0 -0
  339. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/usb_cases.py +0 -0
  340. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/usb_hw.py +0 -0
  341. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/usb_model.py +0 -0
  342. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/wire_options.py +0 -0
  343. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/wire_options_model.py +0 -0
  344. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/wire_options_sample.py +0 -0
  345. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/writer_lease.py +0 -0
  346. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/writer_lease_model.py +0 -0
  347. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/conformance/writer_lease_sample.py +0 -0
  348. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/console.py +0 -0
  349. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/core.py +0 -0
  350. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/discovery.py +0 -0
  351. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/endpoint.py +0 -0
  352. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/fixture.py +0 -0
  353. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/frames.py +0 -0
  354. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/hardware.py +0 -0
  355. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/hid_stream.py +0 -0
  356. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/host.py +0 -0
  357. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/interfaces.py +0 -0
  358. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/kept_session.py +0 -0
  359. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/link.py +0 -0
  360. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/linktest.py +0 -0
  361. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/memo.py +0 -0
  362. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/message.py +0 -0
  363. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/names.py +0 -0
  364. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/pins.py +0 -0
  365. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/probe_log.py +0 -0
  366. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/pyserial/__init__.py +0 -0
  367. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/pyserial/protocol_oep.py +0 -0
  368. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/pytest_conformance.py +0 -0
  369. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/pytest_rp2040_peer.py +0 -0
  370. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/riscv.py +0 -0
  371. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/rp2040.py +0 -0
  372. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/rp2040_peer.py +0 -0
  373. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/rp2350.py +0 -0
  374. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/settings.py +0 -0
  375. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/speed_record.py +0 -0
  376. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/stimulus.py +0 -0
  377. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/targets.py +0 -0
  378. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/uiapduino.py +0 -0
  379. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/usb_stream.py +0 -0
  380. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/virtual_bench_capture.py +0 -0
  381. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/virtual_bench_mdns.py +0 -0
  382. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/virtual_bench_serial.py +0 -0
  383. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/virtual_bench_serve.py +0 -0
  384. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/virtual_bench_trigger.py +0 -0
  385. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/virtual_bench_usb.py +0 -0
  386. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/virtual_core.py +0 -0
  387. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/virtual_fixture_drive.py +0 -0
  388. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/src/oep_client/virtual_names.py +0 -0
  389. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/conftest.py +0 -0
  390. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/equipment/.env.example +0 -0
  391. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/equipment/test_core_contract.py +0 -0
  392. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/equipment/test_preflight.py +0 -0
  393. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/fixtures/hardware.virtual.toml +0 -0
  394. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/.env.example +0 -0
  395. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/.env.virtual.example +0 -0
  396. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/README.ja.md +0 -0
  397. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/README.md +0 -0
  398. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/__init__.py +0 -0
  399. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/boards.py +0 -0
  400. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/conftest.py +0 -0
  401. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/firmware.py +0 -0
  402. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/flash.py +0 -0
  403. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/hardware.example.toml +0 -0
  404. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/hardware.resolved.example.toml +0 -0
  405. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/record.py +0 -0
  406. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/.gitignore +0 -0
  407. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.26+5bafb92-0.0.26.json +0 -0
  408. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.26+654b06a-0.0.26.json +0 -0
  409. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.27+ec1df99-0.0.27.json +0 -0
  410. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32+1491c13-0.0.31-20261016T133559.json +0 -0
  411. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32+672bf7b-0.0.32-20261016T164655.json +0 -0
  412. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131458.json +0 -0
  413. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131510.json +0 -0
  414. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131526.json +0 -0
  415. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131532.json +0 -0
  416. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131656.json +0 -0
  417. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131703.json +0 -0
  418. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T131708.json +0 -0
  419. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132050.json +0 -0
  420. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132057.json +0 -0
  421. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.32-0.0.31-20261016T132104.json +0 -0
  422. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.36+f8ac55a-0.0.36-20261022T160307.json +0 -0
  423. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.36+f8ac55a-0.0.36-20261022T161655.json +0 -0
  424. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.37+1031feb-0.0.37-20261023T214002.json +0 -0
  425. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.38+7c158ff-0.0.38-20261027T081156.json +0 -0
  426. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+1ad47c7-0.0.39-20261027T182907.json +0 -0
  427. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+2c0c41f-0.0.39-20261027T174907.json +0 -0
  428. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+9317805-0.0.39-20261027T191153.json +0 -0
  429. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+a75fd45-0.0.39-20261027T205055.json +0 -0
  430. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201038.json +0 -0
  431. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201057.json +0 -0
  432. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201058.json +0 -0
  433. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+ca5f896-0.0.39-20261027T201059.json +0 -0
  434. {oep_client_python-0.0.53 → 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
  435. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+d4d323c-0.0.39-20261028T190815.json +0 -0
  436. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/9489dd2ae0953650-0.0.39+d4d323c-0.0.39-20261028T191854.json +0 -0
  437. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+1ad47c7-0.0.39-20261027T181116.json +0 -0
  438. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+1ad47c7-0.0.39-20261027T181812.json +0 -0
  439. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+1ad47c7-0.0.39-20261027T182903.json +0 -0
  440. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+62463f2-0.0.39-20261029T145541.json +0 -0
  441. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+9317805-0.0.39-20261027T191150.json +0 -0
  442. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+a75fd45-0.0.39-20261028T190803.json +0 -0
  443. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+b7fbdf9-0.0.39-20261027T191727.json +0 -0
  444. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+b7fbdf9-0.0.39-20261027T204611.json +0 -0
  445. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+bb371fb-0.0.39-20261028T191811.json +0 -0
  446. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.39+bb371fb-0.0.39-20261028T191849.json +0 -0
  447. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.44+34c0b0b-0.0.44-20261104T190820.json +0 -0
  448. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-0.0.44+34c0b0b-0.0.44-20261104T190903.json +0 -0
  449. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/e8f60ae84e28-unknown-0.0.44-20261104T190857.json +0 -0
  450. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.26+4fad559-0.0.26.json +0 -0
  451. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.26+5bafb92-0.0.26.json +0 -0
  452. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32+1491c13-0.0.31-20261016T133501.json +0 -0
  453. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32+672bf7b-0.0.32-20261016T164559.json +0 -0
  454. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32-0.0.31-20261016T130922.json +0 -0
  455. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.32-0.0.31-20261016T131024.json +0 -0
  456. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.36+12e1222-0.0.37-20261023T214016.json +0 -0
  457. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.36+f8ac55a-0.0.36-20261022T160134.json +0 -0
  458. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.37+1031feb-0.0.37-20261023T214230.json +0 -0
  459. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.38+7c158ff-0.0.38-20261027T081159.json +0 -0
  460. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+2c0c41f-0.0.39-20261027T174933.json +0 -0
  461. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+9317805-0.0.39-20261027T191154.json +0 -0
  462. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+b7fbdf9-0.0.39-20261027T204617.json +0 -0
  463. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-d0wd-v3-0070070d9394-0.0.39+bb371fb-0.0.39-20261028T191816.json +0 -0
  464. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.25-0.0.26.json +0 -0
  465. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+5bafb92-0.0.26.json +0 -0
  466. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+654b06a-0.0.26.json +0 -0
  467. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.26+e877631-0.0.26.json +0 -0
  468. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27+ac80e07-0.0.27.json +0 -0
  469. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27+ec1df99-0.0.27.json +0 -0
  470. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.27-0.0.27.json +0 -0
  471. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.28-0.0.28.json +0 -0
  472. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb-0.0.37-20261023T220718.json +0 -0
  473. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-0.0.37+1031feb-0.0.37-20261023T221106.json +0 -0
  474. {oep_client_python-0.0.53 → 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
  475. {oep_client_python-0.0.53 → 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
  476. {oep_client_python-0.0.53 → 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
  477. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-unknown-0.0.26.json +0 -0
  478. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-unknown-0.0.37-20261023T214102.json +0 -0
  479. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-pico-d4-50029191fe34-unknown-0.0.39-20261028T190818.json +0 -0
  480. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0e31108-0.0.26+5bafb92-0.0.26.json +0 -0
  481. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0e31108-0.0.26+654b06a-0.0.26.json +0 -0
  482. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0e31108-0.0.44+34c0b0b-0.0.44-20261104T190941.json +0 -0
  483. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0e343c6-0.0.26+5bafb92-0.0.26.json +0 -0
  484. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0e343c6-0.0.26+654b06a-0.0.26.json +0 -0
  485. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0e343c6-0.0.27+ec1df99-0.0.27.json +0 -0
  486. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0e343c6-0.0.28+ffe4eb1-0.0.28.json +0 -0
  487. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0e343c6-0.0.28-0.0.28.json +0 -0
  488. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+0f013b7-0.0.28.json +0 -0
  489. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+1c940ca-0.0.28.json +0 -0
  490. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+4ef21db+4ef21db-dirty-0.0.28.json +0 -0
  491. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+68d9694-0.0.28.json +0 -0
  492. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+ec38b1d-0.0.28.json +0 -0
  493. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28+ffe4eb1-0.0.28.json +0 -0
  494. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.28-0.0.28.json +0 -0
  495. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.36+f8ac55a-0.0.36-20261022T160503.json +0 -0
  496. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.37+1031feb-0.0.37-20261023T214005.json +0 -0
  497. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.38+7c158ff-0.0.38-20261027T081145.json +0 -0
  498. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.38+7c158ff-0.0.38-20261027T081152.json +0 -0
  499. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+1ad47c7-0.0.39-20261027T180716.json +0 -0
  500. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+1ad47c7-0.0.39-20261027T182855.json +0 -0
  501. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+1ad47c7-0.0.39-20261027T183107.json +0 -0
  502. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+2c0c41f-0.0.39-20261027T174908.json +0 -0
  503. {oep_client_python-0.0.53 → 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
  504. {oep_client_python-0.0.53 → 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
  505. {oep_client_python-0.0.53 → 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
  506. {oep_client_python-0.0.53 → 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
  507. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+62463f2-0.0.39-20261029T145536.json +0 -0
  508. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+7445bee-0.0.39-20261027T155413.json +0 -0
  509. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+9317805-0.0.39-20261027T191146.json +0 -0
  510. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+b7fbdf9-0.0.39-20261027T191724.json +0 -0
  511. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+bb371fb-0.0.39-20261028T191806.json +0 -0
  512. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+bb371fb-0.0.39-20261028T191843.json +0 -0
  513. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-0.0.39+d4d323c-0.0.39-20261028T190809.json +0 -0
  514. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-unknown-0.0.36-20261022T160222.json +0 -0
  515. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-unknown-0.0.39-20261027T155301.json +0 -0
  516. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/results/esp32-series-30eda0ea068b-unknown-0.0.39-20261027T155340.json +0 -0
  517. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/test_harness.py +0 -0
  518. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/hw/test_probe.py +0 -0
  519. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/spec_names.py +0 -0
  520. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_acquire.py +0 -0
  521. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_acquire_beside.py +0 -0
  522. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_address.py +0 -0
  523. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_capabilities.py +0 -0
  524. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_capture.py +0 -0
  525. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_capture_blocks.py +0 -0
  526. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_capture_generation_rules.py +0 -0
  527. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_capture_rules.py +0 -0
  528. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_cobs.py +0 -0
  529. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance.py +0 -0
  530. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_allocator.py +0 -0
  531. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_analog.py +0 -0
  532. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_analog_payload.py +0 -0
  533. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_arm_adi.py +0 -0
  534. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_arm_adi_blocks.py +0 -0
  535. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_attach.py +0 -0
  536. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_blocks.py +0 -0
  537. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_capture_group.py +0 -0
  538. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_capture_group_geometry.py +0 -0
  539. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_capture_metadata.py +0 -0
  540. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_capture_serial.py +0 -0
  541. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_capture_timeline.py +0 -0
  542. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_capture_timeline_lifecycle.py +0 -0
  543. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_clock.py +0 -0
  544. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_core_fixed_fields.py +0 -0
  545. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_core_smoke.py +0 -0
  546. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_corr.py +0 -0
  547. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_cut.py +0 -0
  548. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_data.py +0 -0
  549. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_debug.py +0 -0
  550. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_dependencies.py +0 -0
  551. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_discovery.py +0 -0
  552. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_dmseq.py +0 -0
  553. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_dmseq_target.py +0 -0
  554. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_execution_order.py +0 -0
  555. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_exhausted.py +0 -0
  556. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_fixture_metadata.py +0 -0
  557. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_force_hw.py +0 -0
  558. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_gpio.py +0 -0
  559. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_gpio_lifecycle.py +0 -0
  560. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_host_core.py +0 -0
  561. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_host_critical_calls.py +0 -0
  562. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_host_deadline.py +0 -0
  563. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_host_notifications.py +0 -0
  564. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_host_requests.py +0 -0
  565. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_host_resend.py +0 -0
  566. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_host_tlv.py +0 -0
  567. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_host_values.py +0 -0
  568. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_host_wait.py +0 -0
  569. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_i2c.py +0 -0
  570. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_interface_smoke.py +0 -0
  571. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_interfaces.py +0 -0
  572. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_lease.py +0 -0
  573. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_link_routes.py +0 -0
  574. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_link_transfers.py +0 -0
  575. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_logic.py +0 -0
  576. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_mailbox.py +0 -0
  577. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_notification_output.py +0 -0
  578. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_notification_retention.py +0 -0
  579. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_notification_sequence.py +0 -0
  580. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_oep_declarations.py +0 -0
  581. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_oep_smoke.py +0 -0
  582. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_outcomes.py +0 -0
  583. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_pipeline.py +0 -0
  584. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_port_speed.py +0 -0
  585. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_port_speed_execution.py +0 -0
  586. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_port_speed_lifecycle.py +0 -0
  587. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_probe_input.py +0 -0
  588. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_reconnect.py +0 -0
  589. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_recovery.py +0 -0
  590. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_recovery_races.py +0 -0
  591. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_refusal_order.py +0 -0
  592. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_registered_ops.py +0 -0
  593. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_replay_pressure.py +0 -0
  594. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_replay_records_optional.py +0 -0
  595. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_reset.py +0 -0
  596. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_resources.py +0 -0
  597. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_response_race.py +0 -0
  598. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_restart.py +0 -0
  599. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_retention.py +0 -0
  600. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_retention_lifecycle.py +0 -0
  601. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_retry.py +0 -0
  602. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_reviewed_pins.py +0 -0
  603. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_routes.py +0 -0
  604. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_run.py +0 -0
  605. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_scan.py +0 -0
  606. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_scan_options.py +0 -0
  607. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_selected_metadata.py +0 -0
  608. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_serial.py +0 -0
  609. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_session_loss.py +0 -0
  610. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_session_smoke.py +0 -0
  611. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_spec_guard.py +0 -0
  612. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_spi.py +0 -0
  613. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_step.py +0 -0
  614. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_stream.py +0 -0
  615. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_subscriptions.py +0 -0
  616. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_tcp.py +0 -0
  617. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_tcp_peers.py +0 -0
  618. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_tcp_recovery.py +0 -0
  619. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_tlv_requests.py +0 -0
  620. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_uart.py +0 -0
  621. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_uart_stream.py +0 -0
  622. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_usb.py +0 -0
  623. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_wire_options.py +0 -0
  624. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_conformance_writer_lease.py +0 -0
  625. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_console_queue_and_reset_settle.py +0 -0
  626. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_core_rules.py +0 -0
  627. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_debug_attach.py +0 -0
  628. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_debug_rules.py +0 -0
  629. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_describe_unset_idle_rules.py +0 -0
  630. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_exact_payload_rules.py +0 -0
  631. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_extension_patterns.py +0 -0
  632. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_fixture_controllers.py +0 -0
  633. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_fixture_link_settings_rules.py +0 -0
  634. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_fixture_out.py +0 -0
  635. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_fixture_targets.py +0 -0
  636. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_flash_console.py +0 -0
  637. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_gpio_drive_and_serve_options.py +0 -0
  638. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_hardware.py +0 -0
  639. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_hid_stream.py +0 -0
  640. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_host_boot_lifecycle.py +0 -0
  641. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_host_recovery_rules.py +0 -0
  642. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_host_rules_bounds_options.py +0 -0
  643. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_host_rules_waits_lines.py +0 -0
  644. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_host_wait_bound.py +0 -0
  645. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_interfaces.py +0 -0
  646. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_link_drop.py +0 -0
  647. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_link_host.py +0 -0
  648. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_link_serial.py +0 -0
  649. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_linktest.py +0 -0
  650. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_literals.py +0 -0
  651. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_memo.py +0 -0
  652. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_minimal_ops.py +0 -0
  653. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_no_resume.py +0 -0
  654. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_open_extensions.py +0 -0
  655. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_passthrough.py +0 -0
  656. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_pins.py +0 -0
  657. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_plan.py +0 -0
  658. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_port_speed.py +0 -0
  659. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_probe_log.py +0 -0
  660. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_request_tails.py +0 -0
  661. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_request_validation_rules.py +0 -0
  662. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_restart.py +0 -0
  663. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_resubscribe_after_reopen.py +0 -0
  664. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_rp2040_peer.py +0 -0
  665. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_rvswd_rest.py +0 -0
  666. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_session.py +0 -0
  667. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_settings.py +0 -0
  668. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_spec_sections.py +0 -0
  669. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_spec_vectors.py +0 -0
  670. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_state_resource_rules.py +0 -0
  671. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_stimulus.py +0 -0
  672. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_target_parts.py +0 -0
  673. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_tcp_discovery.py +0 -0
  674. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_tlv_reader_rules.py +0 -0
  675. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_trace_capture.py +0 -0
  676. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_trace_common.py +0 -0
  677. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_trace_console.py +0 -0
  678. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_trace_core_names.py +0 -0
  679. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_trace_debug.py +0 -0
  680. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_trace_fixture.py +0 -0
  681. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_trace_fixture_drive.py +0 -0
  682. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_trace_link.py +0 -0
  683. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_trace_plan.py +0 -0
  684. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_trace_restart.py +0 -0
  685. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_trace_transports.py +0 -0
  686. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_transport_session_rules.py +0 -0
  687. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_usb_identity.py +0 -0
  688. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_usb_stream.py +0 -0
  689. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_analog_roles.py +0 -0
  690. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_announce.py +0 -0
  691. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture.py +0 -0
  692. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_changing_trigger.py +0 -0
  693. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_channel_time.py +0 -0
  694. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_format_2.py +0 -0
  695. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_formats.py +0 -0
  696. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_initial_trigger_time.py +0 -0
  697. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_lifetime.py +0 -0
  698. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_notifications.py +0 -0
  699. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_one_shot_time.py +0 -0
  700. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_options.py +0 -0
  701. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_pretrigger.py +0 -0
  702. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_query.py +0 -0
  703. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_rates.py +0 -0
  704. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_requests.py +0 -0
  705. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_resume_calibration.py +0 -0
  706. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_trigger_modes.py +0 -0
  707. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_trigger_source.py +0 -0
  708. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_trigger_source_more.py +0 -0
  709. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_capture_waiting.py +0 -0
  710. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_fast_samples.py +0 -0
  711. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_pin_constraints.py +0 -0
  712. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_rules_core.py +0 -0
  713. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_rules_ops_lines.py +0 -0
  714. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_serve_reboot.py +0 -0
  715. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_serve_tcp_connections.py +0 -0
  716. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_spec.py +0 -0
  717. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_bench_targets.py +0 -0
  718. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_core.py +0 -0
  719. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_virtual_core_bool.py +0 -0
  720. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/test_wire_hold.py +0 -0
  721. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/vectors/capture_formats.json +0 -0
  722. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/vectors/checks.json +0 -0
  723. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/vectors/cobs.json +0 -0
  724. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/vectors/confirm.json +0 -0
  725. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/vectors/core_extensions.json +0 -0
  726. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/vectors/core_lifecycle.json +0 -0
  727. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/vectors/core_policy.json +0 -0
  728. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/vectors/discovery.json +0 -0
  729. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/vectors/headers.json +0 -0
  730. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/vectors/interface_boundaries.json +0 -0
  731. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/vectors/interface_profiles.json +0 -0
  732. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/vectors/logic_layout.json +0 -0
  733. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/vectors/ops_encoding.json +0 -0
  734. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/vectors/refusals.json +0 -0
  735. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/tests/vectors/sessions.json +0 -0
  736. {oep_client_python-0.0.53 → oep_client_python-0.0.54}/udev/70-oep-probe.rules +0 -0
@@ -2,6 +2,34 @@
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
+
5
33
  ## 0.0.53
6
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
7
35
  the device under test: `python -m oep_client.rp2040_peer flash oep://<probe>/<port> <elf|bin>` (the port's labels
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: oep-client-python
3
- Version: 0.0.53
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.53"
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"
@@ -2,4 +2,4 @@
2
2
 
3
3
  __all__ = ["__version__"]
4
4
 
5
- __version__ = "0.0.53"
5
+ __version__ = "0.0.54"
@@ -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:
@@ -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:
@@ -145,7 +145,7 @@ def checker_sources_sha256():
145
145
  for name in CHECKER_SOURCES}
146
146
 
147
147
 
148
- REVIEWED_CORE_SHA256 = '0408d232e728bb9692ab1c24cefa1fdbf109c35aeebd378034d86c0f4d19789a' # oep-spec docs/oep-core.ja.md
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):
@@ -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 = '0408d232e728bb9692ab1c24cefa1fdbf109c35aeebd378034d86c0f4d19789a' # oep-spec docs/oep-core.ja.md
11
+ REVIEWED_CORE_SHA256 = '81cffc532f2626812b109d0aa5eef81636799011f410a8bc2fb9ea520fcbf4bc' # oep-spec docs/oep-core.ja.md
12
12
 
13
13
 
14
14
  class CoreSmokeChecks:
@@ -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='0408d232e728bb9692ab1c24cefa1fdbf109c35aeebd378034d86c0f4d19789a'
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}
@@ -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':'0408d232e728bb9692ab1c24cefa1fdbf109c35aeebd378034d86c0f4d19789a',
13
- 'docs/oep-transports.ja.md':'2e99bf8039a3d8f5b55c80b66ac97ac40ddf7ad4711079177ffc947c5790103f'}
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
 
@@ -12,11 +12,11 @@ from . import require, spec_identity
12
12
  REVIEWED = {
13
13
  'interfaces/oep-if-plan.ja.md': 'da8bd60af53499573c07bc33dbd8c4df93eb61a93b91dc57907f26620ae36bbf',
14
14
  'interfaces/oep-if-fixture.ja.md': '777a972349a14d1efa6e4575d3118b4e0566b81a6f22320401d529e4dca585f1',
15
- 'docs/oep-core.ja.md': '0408d232e728bb9692ab1c24cefa1fdbf109c35aeebd378034d86c0f4d19789a',
15
+ 'docs/oep-core.ja.md': '81cffc532f2626812b109d0aa5eef81636799011f410a8bc2fb9ea520fcbf4bc',
16
16
  'interfaces/oep-if-debug.ja.md': '6f21171b494e67d50bfc78b4da9e16949033c9e24d960efb42887335da021681',
17
17
  'interfaces/oep-if-capture.ja.md': 'f1035dc14cf469d929d782dbe710fc2c1e1567006da41a001abe3c5c25761324',
18
18
  }
19
- REVIEWED_REGISTRY_SHA256='82456b04874c4d20775744d2bde3398d7a748d955d73b8f295a5e8e889a46477'
19
+ REVIEWED_REGISTRY_SHA256='183922c36d78c0173cedece530410478dc3f1de0094d1922d3a960e752863d1e'
20
20
 
21
21
 
22
22
  def reviewed_identity(spec):
@@ -6,8 +6,8 @@ from .. import registry as _reg
6
6
  SAVE=_reg.CORE.op['save'] # fn 0's save (core §13.7)
7
7
 
8
8
 
9
- REVIEWED={'docs/oep-core.ja.md':'0408d232e728bb9692ab1c24cefa1fdbf109c35aeebd378034d86c0f4d19789a',
10
- 'docs/oep-transports.ja.md':'2e99bf8039a3d8f5b55c80b66ac97ac40ddf7ad4711079177ffc947c5790103f'}
9
+ REVIEWED={'docs/oep-core.ja.md':'81cffc532f2626812b109d0aa5eef81636799011f410a8bc2fb9ea520fcbf4bc',
10
+ 'docs/oep-transports.ja.md':'a22754ee25997058be0e698bd62ea132537627914f38a06caffd48e3d79f096e'}
11
11
  QUICK_MS=1000 # core_quick_op_max_ms
12
12
 
13
13
 
@@ -179,7 +179,11 @@ def describe_offer(o: Offer) -> dict:
179
179
  if getattr(d, key) is not None:
180
180
  out[key] = getattr(d, key)
181
181
  if d.ops is not None:
182
- out["ops"] = interfaces.op_names(name, d.ops)
182
+ out["ops"] = [d.op_forms[op].name if op in d.op_forms else n
183
+ for op, n in zip(sorted(d.ops), interfaces.op_names(name, d.ops))]
184
+ forms = [f.signature() for op, f in sorted(d.op_forms.items()) if f.form]
185
+ if forms:
186
+ out["op_forms"] = forms
183
187
  if d.features is not None:
184
188
  out["features"] = _features(d.features, known.features if known else {})
185
189
  specific = {}
@@ -241,6 +245,8 @@ def to_text(caps: Capabilities) -> str:
241
245
  lines.append(f"{pad} " + ", ".join(limits))
242
246
  if "ops" in r:
243
247
  lines.append(f"{pad} ops: " + (", ".join(r["ops"]) or "none"))
248
+ for sig in r.get("op_forms", []):
249
+ lines.append(f"{pad} {sig}")
244
250
  if r.get("features"):
245
251
  lines.append(f"{pad} features: " + ", ".join(r["features"]))
246
252
  for k, v in r.get("declares", {}).items():