bec-lib 4.4.2__tar.gz → 4.5.0__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 (166) hide show
  1. {bec_lib-4.4.2 → bec_lib-4.5.0}/PKG-INFO +1 -1
  2. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/endpoints.py +16 -0
  3. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/messages.py +32 -0
  4. {bec_lib-4.4.2 → bec_lib-4.5.0}/pyproject.toml +1 -1
  5. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_bec_messages.py +46 -0
  6. {bec_lib-4.4.2 → bec_lib-4.5.0}/.gitignore +0 -0
  7. {bec_lib-4.4.2 → bec_lib-4.5.0}/README.md +0 -0
  8. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/__init__.py +0 -0
  9. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/_print_versions.py +0 -0
  10. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/acl_login.py +0 -0
  11. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/actors.py +0 -0
  12. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/alarm_handler.py +0 -0
  13. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/atlas_models.py +0 -0
  14. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/bec_errors.py +0 -0
  15. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/bec_service.py +0 -0
  16. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/bec_yaml_loader.py +0 -0
  17. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/bl_state_manager.py +0 -0
  18. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/bl_states.py +0 -0
  19. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/builtin_actor_hli.py +0 -0
  20. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/callback_handler.py +0 -0
  21. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/channel_monitor.py +0 -0
  22. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/client.py +0 -0
  23. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/codecs.py +0 -0
  24. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/config_helper.py +0 -0
  25. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/config_values.py +0 -0
  26. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/configs/__init__.py +0 -0
  27. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/configs/demo_config.yaml +0 -0
  28. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/configs/openapi_schema.json +0 -0
  29. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/connector.py +0 -0
  30. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/dap_plugin_objects.py +0 -0
  31. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/dap_plugins.py +0 -0
  32. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/device.py +0 -0
  33. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/devicemanager.py +0 -0
  34. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/file_utils.py +0 -0
  35. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/live_scan_data.py +0 -0
  36. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/lmfit_serializer.py +0 -0
  37. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/logger.py +0 -0
  38. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/macro_update_handler.py +0 -0
  39. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/messaging_hooks.py +0 -0
  40. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/messaging_services.py +0 -0
  41. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/metadata_schema.py +0 -0
  42. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/numpy_encoder.py +0 -0
  43. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/observer.py +0 -0
  44. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/path_optimization.py +0 -0
  45. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/pdf_writer.py +0 -0
  46. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/plugin_helper.py +0 -0
  47. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/position_generators.py +0 -0
  48. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/procedures/__init__.py +0 -0
  49. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/procedures/helper.py +0 -0
  50. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/procedures/hli.py +0 -0
  51. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/procedures/status.py +0 -0
  52. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/queue_items.py +0 -0
  53. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/redis_connector/__init__.py +0 -0
  54. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/redis_connector/constants.py +0 -0
  55. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/redis_connector/hli.py +0 -0
  56. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/redis_connector/managed_redis_connection.py +0 -0
  57. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/redis_connector/streams.py +0 -0
  58. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/redis_connector/validation.py +0 -0
  59. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/request_context.py +0 -0
  60. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/request_items.py +0 -0
  61. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/scan_args.py +0 -0
  62. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/scan_data_container.py +0 -0
  63. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/scan_history.py +0 -0
  64. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/scan_input_validator.py +0 -0
  65. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/scan_items.py +0 -0
  66. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/scan_manager.py +0 -0
  67. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/scan_number_container.py +0 -0
  68. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/scan_preview.py +0 -0
  69. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/scan_repeat.py +0 -0
  70. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/scan_report.py +0 -0
  71. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/scans.py +0 -0
  72. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/scibec_validator.py +0 -0
  73. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/script_executor.py +0 -0
  74. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/serialization.py +0 -0
  75. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/serialization_registry.py +0 -0
  76. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/service_config.py +0 -0
  77. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/signature_serializer.py +0 -0
  78. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/tests/__init__.py +0 -0
  79. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/tests/fixtures.py +0 -0
  80. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/tests/test_config.yaml +0 -0
  81. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/tests/test_service_config.yaml +0 -0
  82. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/tests/utils.py +0 -0
  83. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/user_macros.py +0 -0
  84. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/__init__.py +0 -0
  85. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/copier_jinja_filters.py +0 -0
  86. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/deprecation.py +0 -0
  87. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/import_utils.py +0 -0
  88. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/json_extended.py +0 -0
  89. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/plugin_manager/__init__.py +0 -0
  90. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/plugin_manager/_constants.py +0 -0
  91. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/plugin_manager/_util.py +0 -0
  92. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/plugin_manager/create/__init__.py +0 -0
  93. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/plugin_manager/create/device.py +0 -0
  94. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/plugin_manager/create/scan.py +0 -0
  95. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/plugin_manager/create/templates/scan.py.jinja +0 -0
  96. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/plugin_manager/main.py +0 -0
  97. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/proxy.py +0 -0
  98. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/pydantic_pretty_print.py +0 -0
  99. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/rpc_utils.py +0 -0
  100. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/scan_utils.py +0 -0
  101. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/threading_utils.py +0 -0
  102. {bec_lib-4.4.2 → bec_lib-4.5.0}/bec_lib/utils/user_acls_test.py +0 -0
  103. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/__init__.py +0 -0
  104. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/_additional_for_signature_serializer_test.py +0 -0
  105. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/conftest.py +0 -0
  106. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_acl_login.py +0 -0
  107. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_alarm_handler.py +0 -0
  108. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_atlas_models.py +0 -0
  109. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_beamline_states.py +0 -0
  110. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_bec_logger.py +0 -0
  111. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_bec_service.py +0 -0
  112. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_callback_handler.py +0 -0
  113. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_channel_monitor.py +0 -0
  114. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_client.py +0 -0
  115. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_config_helper.py +0 -0
  116. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_core_utils.py +0 -0
  117. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_dap_plugins.py +0 -0
  118. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_data_container.py +0 -0
  119. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_deprecation.py +0 -0
  120. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_device_hashing.py +0 -0
  121. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_device_manager.py +0 -0
  122. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_devices.py +0 -0
  123. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_file_utils.py +0 -0
  124. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_hli_connector_fakeredis.py +0 -0
  125. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_hli_redis_connector.py +0 -0
  126. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_import_utils.py +0 -0
  127. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_jinja_plugins.py +0 -0
  128. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_lmfit_serializer.py +0 -0
  129. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_managed_config_values.py +0 -0
  130. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_managed_redis_connection.py +0 -0
  131. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_messaging_hooks.py +0 -0
  132. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_messaging_service.py +0 -0
  133. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_metadata_schema.py +0 -0
  134. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_observer.py +0 -0
  135. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_path_optimization.py +0 -0
  136. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_pdf_writer.py +0 -0
  137. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_plugin_helper.py +0 -0
  138. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_plugin_manager.py +0 -0
  139. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_plugin_system.py +0 -0
  140. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_position_generators.py +0 -0
  141. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_procedure_submission.py +0 -0
  142. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_pydantic_pretty_print.py +0 -0
  143. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_queue_items.py +0 -0
  144. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_redis_connector_fakeredis.py +0 -0
  145. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_roi_endpoints.py +0 -0
  146. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_roi_messages.py +0 -0
  147. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_scan_context.py +0 -0
  148. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_scan_data.py +0 -0
  149. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_scan_history.py +0 -0
  150. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_scan_items.py +0 -0
  151. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_scan_manager.py +0 -0
  152. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_scan_object.py +0 -0
  153. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_scan_preview.py +0 -0
  154. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_scan_repeat.py +0 -0
  155. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_scan_report.py +0 -0
  156. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_scibec_validator.py +0 -0
  157. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_script_executor.py +0 -0
  158. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_serializer.py +0 -0
  159. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_service_config.py +0 -0
  160. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_signature_serializer.py +0 -0
  161. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_signature_serializer_with_future_import.py +0 -0
  162. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_stream_subs.py +0 -0
  163. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_user_macros.py +0 -0
  164. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_utils.py +0 -0
  165. {bec_lib-4.4.2 → bec_lib-4.5.0}/tests/test_yaml_loader.py +0 -0
  166. {bec_lib-4.4.2 → bec_lib-4.5.0}/util_scripts/init_config.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: bec_lib
3
- Version: 4.4.2
3
+ Version: 4.5.0
4
4
  Summary: BEC library
5
5
  Project-URL: Bug Tracker, https://github.com/bec-project/bec/issues
6
6
  Project-URL: Homepage, https://github.com/bec-project/bec
@@ -796,6 +796,22 @@ class MessageEndpoints:
796
796
  message_op=MessageOp.SET_PUBLISH,
797
797
  )
798
798
 
799
+ @staticmethod
800
+ def scan_hook() -> EndpointInfo:
801
+ """Endpoint for the latest scan hook or instruction update of the running scan.
802
+
803
+ Step changes are published at once, instruction updates at most once per 0.1 second
804
+ window. The latest update is stored, so clients that start mid-scan can read it.
805
+
806
+ Returns:
807
+ EndpointInfo: Endpoint carrying messages.ScanHookMessage updates.
808
+ """
809
+ return EndpointInfo(
810
+ endpoint=f"{EndpointType.INFO.value}/scans/scan_hook",
811
+ message_type=messages.ScanHookMessage,
812
+ message_op=MessageOp.SET_PUBLISH,
813
+ )
814
+
799
815
  @staticmethod
800
816
  def scan_progress():
801
817
  """
@@ -763,6 +763,38 @@ class DeviceInstructionMessage(BECMessage):
763
763
  parameter: dict
764
764
 
765
765
 
766
+ class ScanHookMessage(BECMessage):
767
+ """A scan lifecycle event, optionally including dispatched device instructions.
768
+
769
+ Args:
770
+ scan_id (str): Scan whose lifecycle is being reported.
771
+ hook (str | None): Active lifecycle hook, or None before a hook has started.
772
+ status (Literal["running", "completed", "interrupted", "error"]): Hook execution state.
773
+ "interrupted" means the step was ended by a user or alarm interruption of the scan
774
+ (finish now, abort or halt); "error" is used for any other exception.
775
+ instructions (list[DeviceInstructionMessage]): Instructions dispatched in this hook.
776
+ Instruction updates are coalesced to the latest one in each 0.1 second window;
777
+ the start, completion or failure of a top-level step is sent at once.
778
+ waiting (bool): Whether this update was recorded during a device or exposure wait.
779
+ Wait updates include only pending instructions. The next hook or instruction update
780
+ replaces the wait; no separate update is emitted when waiting ends.
781
+ wait_started_at (float | None): Start time of the reported wait, or None for other updates.
782
+ hook_started_at (float | None): Start time of the current top-level step, e.g. scan_core,
783
+ or None outside a step.
784
+ timestamp (float): Time at which the lifecycle or instruction event was recorded.
785
+ """
786
+
787
+ msg_type: ClassVar[str] = "scan_hook"
788
+ scan_id: str
789
+ hook: str | None
790
+ status: Literal["running", "completed", "interrupted", "error"] = "running"
791
+ instructions: list[DeviceInstructionMessage] = Field(default_factory=list)
792
+ timestamp: float = Field(default_factory=time.time)
793
+ waiting: bool = False
794
+ wait_started_at: float | None = None
795
+ hook_started_at: float | None = None
796
+
797
+
766
798
  class ErrorInfo(BaseModel):
767
799
  id: str = Field(default_factory=lambda: str(uuid.uuid4()))
768
800
  error_message: str
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "bec_lib"
7
- version = "4.4.2"
7
+ version = "4.5.0"
8
8
  description = "BEC library"
9
9
  requires-python = ">=3.11"
10
10
  classifiers = [
@@ -1124,3 +1124,49 @@ def test_feedback_message():
1124
1124
  assert res_loaded == msg
1125
1125
  assert res_loaded.username == getpass.getuser()
1126
1126
  assert res_loaded.versions == messages.ServiceVersions._get_version_numbers()
1127
+
1128
+
1129
+ def test_scan_hook_message_roundtrip():
1130
+ instruction = messages.DeviceInstructionMessage(
1131
+ device="samx", action="set", parameter={"value": 2}, metadata={"device_instr_id": "move"}
1132
+ )
1133
+ msg = messages.ScanHookMessage(
1134
+ scan_id="scan-id",
1135
+ hook="pre_scan",
1136
+ instructions=[instruction],
1137
+ metadata={"RID": "request-id", "queue_id": "queue-id"},
1138
+ )
1139
+ loaded = MsgpackSerialization.loads(MsgpackSerialization.dumps(msg))
1140
+ assert loaded == msg
1141
+ assert isinstance(loaded.instructions[0], messages.DeviceInstructionMessage)
1142
+ assert messages.ScanHookMessage(scan_id="scan-id", hook="stage").instructions == []
1143
+
1144
+
1145
+ def test_scan_hook_wait_fields_are_optional_and_roundtrip():
1146
+ old_update = messages.ScanHookMessage.model_validate(
1147
+ {"scan_id": "scan-id", "hook": "at_each_point", "status": "running", "instructions": []}
1148
+ )
1149
+ assert old_update.waiting is False
1150
+ assert old_update.wait_started_at is None
1151
+ assert old_update.hook_started_at is None
1152
+ waiting = old_update.model_copy(update={"waiting": True, "wait_started_at": 1791244800.0})
1153
+ loaded = MsgpackSerialization.loads(MsgpackSerialization.dumps(waiting))
1154
+ assert loaded == waiting
1155
+ assert loaded.waiting is True
1156
+ assert loaded.wait_started_at == 1791244800.0
1157
+
1158
+
1159
+ def test_scan_hook_step_start_roundtrips():
1160
+ msg = messages.ScanHookMessage(
1161
+ scan_id="scan-id", hook="scan_core", status="error", hook_started_at=1791244800.0
1162
+ )
1163
+ loaded = MsgpackSerialization.loads(MsgpackSerialization.dumps(msg))
1164
+ assert loaded == msg
1165
+ assert loaded.hook_started_at == 1791244800.0
1166
+
1167
+
1168
+ def test_scan_hook_interrupted_status_roundtrips():
1169
+ msg = messages.ScanHookMessage(scan_id="scan-id", hook="scan_core", status="interrupted")
1170
+ loaded = MsgpackSerialization.loads(MsgpackSerialization.dumps(msg))
1171
+ assert loaded == msg
1172
+ assert loaded.status == "interrupted"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes