pycontrol-core 3.0.0a3__tar.gz → 3.0.0a4__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 (248) hide show
  1. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/PKG-INFO +1 -1
  2. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/pyproject.toml +1 -1
  3. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/__init__.py +1 -1
  4. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/cli/commands/handlers.py +2 -2
  5. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/session/services/firmware.py +7 -0
  6. pycontrol_core-3.0.0a4/tests/unit/test_firmware_service.py +33 -0
  7. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/.gitignore +0 -0
  8. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/.pre-commit-config.yaml +0 -0
  9. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/DELETED.md +0 -0
  10. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/LICENSE +0 -0
  11. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/README.md +0 -0
  12. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/cmd/pycontrol-init/README.md +0 -0
  13. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/cmd/pycontrol-init/go.mod +0 -0
  14. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/cmd/pycontrol-init/go.sum +0 -0
  15. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/cmd/pycontrol-init/internal/bootstrap/bootstrap.go +0 -0
  16. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/cmd/pycontrol-init/internal/bootstrap/bootstrap_test.go +0 -0
  17. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/cmd/pycontrol-init/main.go +0 -0
  18. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/cmd/pycontrol-init/pycontrol-init +0 -0
  19. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/architecture.md +0 -0
  20. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/changelog.md +0 -0
  21. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/cli-reference.md +0 -0
  22. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/contracts.md +0 -0
  23. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/data-format.md +0 -0
  24. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/design-history/simplified-pycontrol-provenance-and-sharing-motivation.md +0 -0
  25. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/design-history/simplified-pycontrol-provenance-and-sharing-plan.md +0 -0
  26. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/experiment-extensions.md +0 -0
  27. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/extension-settings.md +0 -0
  28. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/getting-started.md +0 -0
  29. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/hardware-definitions.md +0 -0
  30. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/migration-from-official.md +0 -0
  31. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/public-api.md +0 -0
  32. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/sharing.md +0 -0
  33. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/subscriber-api.md +0 -0
  34. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/task-extensions.md +0 -0
  35. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/testing.md +0 -0
  36. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/threading-and-state.md +0 -0
  37. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/troubleshooting.md +0 -0
  38. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/wire-protocol.md +0 -0
  39. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/docs/writing-tasks.md +0 -0
  40. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/bundles/__init__.py +0 -0
  41. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/bundles/collect.py +0 -0
  42. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/bundles/legacy.py +0 -0
  43. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/bundles/models.py +0 -0
  44. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/bundles/protocol.py +0 -0
  45. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/bundles/run.py +0 -0
  46. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/bundles/zipio.py +0 -0
  47. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/bus/__init__.py +0 -0
  48. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/bus/enriched.py +0 -0
  49. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/bus/events.py +0 -0
  50. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/bus/subscriber.py +0 -0
  51. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/bus/timestamps.py +0 -0
  52. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/cli/__init__.py +0 -0
  53. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/cli/commands/__init__.py +0 -0
  54. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/cli/commands/board.py +0 -0
  55. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/cli/commands/experiment.py +0 -0
  56. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/cli/commands/firmware.py +0 -0
  57. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/cli/commands/run.py +0 -0
  58. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/cli/commands/setups.py +0 -0
  59. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/cli/commands/vars.py +0 -0
  60. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/cli/commands/workspace.py +0 -0
  61. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/cli/main.py +0 -0
  62. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/config/__init__.py +0 -0
  63. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/config/io.py +0 -0
  64. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/config/models.py +0 -0
  65. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/experiment/__init__.py +0 -0
  66. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/experiment/fleet_fanin.py +0 -0
  67. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/experiment/hooks.py +0 -0
  68. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/extension/__init__.py +0 -0
  69. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/extension/controls.py +0 -0
  70. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/extension/experiment_api.py +0 -0
  71. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/extension/loader.py +0 -0
  72. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/extension/task_api.py +0 -0
  73. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/extension/task_controls_context.py +0 -0
  74. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/__init__.py +0 -0
  75. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/device_helpers.py +0 -0
  76. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/LED_driver.py +0 -0
  77. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/MCP.py +0 -0
  78. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/VL53L4.py +0 -0
  79. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/__init__.py +0 -0
  80. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/analog_LED.py +0 -0
  81. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/audio_board.py +0 -0
  82. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/audio_player.py +0 -0
  83. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/breakout_1_2.py +0 -0
  84. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/breakout_H7.py +0 -0
  85. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/five_poke.py +0 -0
  86. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/frame_logger.py +0 -0
  87. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/frame_trigger.py +0 -0
  88. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/grid_maze.py +0 -0
  89. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/lickometer.py +0 -0
  90. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/load_cell.py +0 -0
  91. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/nine_poke.py +0 -0
  92. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/poke.py +0 -0
  93. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/port_expander.py +0 -0
  94. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/rotary_encoder.py +0 -0
  95. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/schmitt_trigger.py +0 -0
  96. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/solenoid_driver.py +0 -0
  97. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/stepper_motor.py +0 -0
  98. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/uRFID.py +0 -0
  99. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/devices/uart_handler.py +0 -0
  100. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/pycontrol/__init__.py +0 -0
  101. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/pycontrol/audio.py +0 -0
  102. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/pycontrol/framework.py +0 -0
  103. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/pycontrol/hardware.py +0 -0
  104. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/pycontrol/profiles.py +0 -0
  105. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/pycontrol/state_machine.py +0 -0
  106. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/pycontrol/timer.py +0 -0
  107. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/firmware/pycontrol/utility.py +0 -0
  108. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/fleet/__init__.py +0 -0
  109. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/fleet/envelope.py +0 -0
  110. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/integrations/__init__.py +0 -0
  111. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/integrations/_queue.py +0 -0
  112. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/integrations/notify/__init__.py +0 -0
  113. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/integrations/notify/slack.py +0 -0
  114. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/integrations/notify/telegram.py +0 -0
  115. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/mcu.py +0 -0
  116. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/protocol/__init__.py +0 -0
  117. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/protocol/analog.py +0 -0
  118. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/protocol/decoder.py +0 -0
  119. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/protocol/encoder.py +0 -0
  120. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/protocol/messages.py +0 -0
  121. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/provenance/__init__.py +0 -0
  122. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/provenance/archive.py +0 -0
  123. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/provenance/collect.py +0 -0
  124. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/provenance/hashing.py +0 -0
  125. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/provenance/models.py +0 -0
  126. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/recording/__init__.py +0 -0
  127. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/recording/analog_writer.py +0 -0
  128. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/recording/console.py +0 -0
  129. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/recording/fleet_aggregator.py +0 -0
  130. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/recording/formatting.py +0 -0
  131. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/recording/native_event_logger.py +0 -0
  132. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/recording/tsv_logger.py +0 -0
  133. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/repl/__init__.py +0 -0
  134. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/repl/device_helpers.py +0 -0
  135. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/repl/file_transfer.py +0 -0
  136. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/repl/json_repl.py +0 -0
  137. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/repl/raw_repl.py +0 -0
  138. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/session/__init__.py +0 -0
  139. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/session/board_session.py +0 -0
  140. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/session/commands.py +0 -0
  141. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/session/device_resolution.py +0 -0
  142. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/session/info.py +0 -0
  143. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/session/services/__init__.py +0 -0
  144. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/session/services/setup.py +0 -0
  145. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/transport/__init__.py +0 -0
  146. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/transport/base.py +0 -0
  147. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/transport/mock.py +0 -0
  148. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/transport/recording.py +0 -0
  149. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/transport/replay.py +0 -0
  150. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/transport/serial.py +0 -0
  151. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace/__init__.py +0 -0
  152. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace/creation.py +0 -0
  153. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace/hwdef_inspect.py +0 -0
  154. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace/task_inspect.py +0 -0
  155. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace_template/__init__.py +0 -0
  156. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace_template/devices/__init__.py +0 -0
  157. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace_template/devices/example_widget.py +0 -0
  158. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace_template/experiments/blink_demo.json +0 -0
  159. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace_template/hardware_definitions/bliink_f4_hw.py +0 -0
  160. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace_template/hardware_definitions/sequence_hw.py +0 -0
  161. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace_template/plugins/experiment_extensions/notion_logger.py +0 -0
  162. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace_template/plugins/experiment_extensions/s3_data_exporter.py +0 -0
  163. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace_template/plugins/task_controls/example_dialog.py +0 -0
  164. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace_template/plugins/task_extensions/example_extension.py +0 -0
  165. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace_template/plugins/task_extensions/run_notify.py +0 -0
  166. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace_template/plugins/task_extensions/trial_summary.py +0 -0
  167. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace_template/settings.json +0 -0
  168. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace_template/setups.json +0 -0
  169. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace_template/tasks/blinker.py +0 -0
  170. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace_template/tasks/examples/blinker.py +0 -0
  171. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/src/pycontrol/workspace_template/tasks/examples/button.py +0 -0
  172. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/CLASSIFICATION.md +0 -0
  173. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/__init__.py +0 -0
  174. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/conftest.py +0 -0
  175. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/contracts/test_bus_contract.py +0 -0
  176. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/contracts/test_data_contract.py +0 -0
  177. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/contracts/test_fleet_envelope_contract.py +0 -0
  178. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/contracts/test_session_lifecycle_contract.py +0 -0
  179. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/contracts/test_task_authoring_contract.py +0 -0
  180. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/firmware_stubs/__init__.py +0 -0
  181. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/firmware_stubs/micropython.py +0 -0
  182. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/firmware_stubs/pyb.py +0 -0
  183. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/firmware_stubs/ucollections.py +0 -0
  184. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/firmware_stubs/ujson.py +0 -0
  185. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/__init__.py +0 -0
  186. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/build_synthetic.py +0 -0
  187. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/frames/analog.in.bin +0 -0
  188. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/frames/blinker.in.bin +0 -0
  189. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/frames/blinker_real.in.bin +0 -0
  190. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/frames/blinker_real.out.bin +0 -0
  191. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/frames/counter_demo_real.in.bin +0 -0
  192. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/frames/counter_demo_real.out.bin +0 -0
  193. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/frames/encoder_real.in.bin +0 -0
  194. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/frames/encoder_real.out.bin +0 -0
  195. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/frames/random_ratio.in.bin +0 -0
  196. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/replay.py +0 -0
  197. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/sessions/blinker_real.meta.json +0 -0
  198. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/sessions/blinker_real.tsv +0 -0
  199. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/sessions/counter_demo_real.meta.json +0 -0
  200. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/sessions/counter_demo_real.tsv +0 -0
  201. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/sessions/encoder_real.meta.json +0 -0
  202. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/sessions/encoder_real.tsv +0 -0
  203. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/sessions/encoder_real_encoder.data.npy +0 -0
  204. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/sessions/encoder_real_encoder.time.npy +0 -0
  205. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/spec_frames.py +0 -0
  206. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/tasks/blinker_real.task.py +0 -0
  207. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/tasks/counter_demo_real.task.py +0 -0
  208. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/golden/tasks/encoder_real.task.py +0 -0
  209. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/integration/__init__.py +0 -0
  210. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/integration/fake_board/__init__.py +0 -0
  211. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/integration/fake_board/responder.py +0 -0
  212. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/integration/test_board_session.py +0 -0
  213. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/integration/test_cli_workspace.py +0 -0
  214. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/integration/test_experiment_runner.py +0 -0
  215. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/integration/test_real_hardware_replay.py +0 -0
  216. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/integration/test_repl.py +0 -0
  217. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/__init__.py +0 -0
  218. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/firmware/__init__.py +0 -0
  219. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/firmware/conftest.py +0 -0
  220. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/firmware/test_device_helpers.py +0 -0
  221. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/firmware/test_devices_init.py +0 -0
  222. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/firmware/test_hardware_uses_profile.py +0 -0
  223. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/firmware/test_profiles.py +0 -0
  224. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/firmware/test_timer_rounding.py +0 -0
  225. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_bundles_collect.py +0 -0
  226. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_bus_subscriber.py +0 -0
  227. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_cli.py +0 -0
  228. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_config_models.py +0 -0
  229. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_extension.py +0 -0
  230. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_file_transfer_errors.py +0 -0
  231. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_firmware_root.py +0 -0
  232. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_fleet_fanin.py +0 -0
  233. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_golden_fixtures.py +0 -0
  234. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_hwdef_ordering.py +0 -0
  235. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_integrations_notify.py +0 -0
  236. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_protocol_decoder.py +0 -0
  237. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_protocol_encoder.py +0 -0
  238. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_provenance.py +0 -0
  239. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_recording_tsv.py +0 -0
  240. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_transport_mock.py +0 -0
  241. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_workspace.py +0 -0
  242. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_workspace_hwdef_inspect.py +0 -0
  243. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tests/unit/test_workspace_template.py +0 -0
  244. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tools/README.md +0 -0
  245. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tools/analog_diagnose.py +0 -0
  246. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tools/capture_fixtures.py +0 -0
  247. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/tools/encoder_diagnose.py +0 -0
  248. {pycontrol_core-3.0.0a3 → pycontrol_core-3.0.0a4}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pycontrol-core
3
- Version: 3.0.0a3
3
+ Version: 3.0.0a4
4
4
  Summary: Sans-IO host library for the pyControl behavioural-experiment framework.
5
5
  Project-URL: Homepage, https://github.com/karpova-lab/pycontrol-core
6
6
  Author: pyControl contributors
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pycontrol-core"
7
- version = "3.0.0a3"
7
+ version = "3.0.0a4"
8
8
  description = "Sans-IO host library for the pyControl behavioural-experiment framework."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1,5 +1,5 @@
1
1
  """pycontrol host library: sans-IO core + extension points."""
2
2
 
3
- __version__ = "3.0.0a3"
3
+ __version__ = "3.0.0a4"
4
4
 
5
5
  __all__ = ["__version__"]
@@ -608,10 +608,10 @@ def _cmd_firmware_sync(args: argparse.Namespace) -> int:
608
608
  from pycontrol.transport.serial import SerialTransport
609
609
 
610
610
  transport = SerialTransport(port, baudrate=baud)
611
- session = BoardSession(transport, expected_mcu=expected_mcu)
611
+ session = BoardSession(transport, expected_mcu=expected_mcu, check_firmware_on_connect=False)
612
612
  try:
613
613
  try:
614
- session.connect()
614
+ session.connect(import_framework=False)
615
615
  except BoardSessionError as exc:
616
616
  print(f"error: {exc}", file=sys.stderr)
617
617
  return 2
@@ -171,6 +171,8 @@ class FirmwareService:
171
171
  try:
172
172
  on_board = self._session._json.call_helper("info_listdir", target_dir) or []
173
173
  except RawReplError as exc:
174
+ if _is_missing_path_error(exc):
175
+ return []
174
176
  raise BoardSessionError(f"firmware sync: failed to list {target_dir}: {exc}") from exc
175
177
  ignored = ignored_names or set()
176
178
  return [
@@ -255,3 +257,8 @@ class FirmwareService:
255
257
  if tmp_path is not None:
256
258
  with contextlib.suppress(OSError):
257
259
  tmp_path.unlink()
260
+
261
+
262
+ def _is_missing_path_error(exc: RawReplError) -> bool:
263
+ msg = str(exc)
264
+ return "ENOENT" in msg or "[Errno 2]" in msg
@@ -0,0 +1,33 @@
1
+ from __future__ import annotations
2
+
3
+ import pytest
4
+
5
+ from pycontrol.repl.raw_repl import RawReplError
6
+ from pycontrol.session import BoardSessionError
7
+ from pycontrol.session.services.firmware import FirmwareService
8
+
9
+
10
+ class _Json:
11
+ def __init__(self, exc: RawReplError) -> None:
12
+ self._exc = exc
13
+
14
+ def call_helper(self, _name: str, _path: str) -> object:
15
+ raise self._exc
16
+
17
+
18
+ class _Session:
19
+ def __init__(self, exc: RawReplError) -> None:
20
+ self._json = _Json(exc)
21
+
22
+
23
+ def test_board_side_extras_treats_missing_directory_as_empty() -> None:
24
+ service = FirmwareService(_Session(RawReplError("OSError: [Errno 2] ENOENT"))) # type: ignore[arg-type]
25
+
26
+ assert service.board_side_extras("/flash/pycontrol", {"framework.py"}) == []
27
+
28
+
29
+ def test_board_side_extras_reraises_non_missing_listdir_errors() -> None:
30
+ service = FirmwareService(_Session(RawReplError("OSError: permission denied"))) # type: ignore[arg-type]
31
+
32
+ with pytest.raises(BoardSessionError, match="failed to list /flash/pycontrol"):
33
+ service.board_side_extras("/flash/pycontrol", {"framework.py"})