bec-server 3.146.2__tar.gz → 3.147.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 (211) hide show
  1. {bec_server-3.146.2 → bec_server-3.147.0}/PKG-INFO +1 -1
  2. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/device_server/bec_message_handler.py +64 -1
  3. {bec_server-3.146.2 → bec_server-3.147.0}/pyproject.toml +2 -1
  4. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_device_server/test_device_manager_ds.py +8 -9
  5. {bec_server-3.146.2 → bec_server-3.147.0}/.gitignore +0 -0
  6. {bec_server-3.146.2 → bec_server-3.147.0}/.zed/debug.json +0 -0
  7. {bec_server-3.146.2 → bec_server-3.147.0}/README.md +0 -0
  8. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/__init__.py +0 -0
  9. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/actors/__init__.py +0 -0
  10. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/actors/actor.py +0 -0
  11. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/actors/builtin_actor_manager.py +0 -0
  12. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/actors/manager.py +0 -0
  13. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/actors/scan_interlock.py +0 -0
  14. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/actors/worker.py +0 -0
  15. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/bec_server_utils/__init__.py +0 -0
  16. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/bec_server_utils/launch.py +0 -0
  17. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/bec_server_utils/service_handler.py +0 -0
  18. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/bec_server_utils/subprocess_launch.py +0 -0
  19. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/bec_server_utils/tmux_launch.py +0 -0
  20. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/data_processing/__init__.py +0 -0
  21. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/data_processing/cli/__init__.py +0 -0
  22. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/data_processing/cli/launch.py +0 -0
  23. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/data_processing/dap_server.py +0 -0
  24. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/data_processing/dap_service.py +0 -0
  25. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/data_processing/dap_service_manager.py +0 -0
  26. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/data_processing/image_analysis_service.py +0 -0
  27. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/data_processing/lmfit1d_service.py +0 -0
  28. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/device_server/__init__.py +0 -0
  29. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/device_server/cli/__init__.py +0 -0
  30. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/device_server/cli/launch.py +0 -0
  31. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/device_server/device_server.py +0 -0
  32. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/device_server/devices/__init__.py +0 -0
  33. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/device_server/devices/config_update_handler.py +0 -0
  34. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/device_server/devices/device_serializer.py +0 -0
  35. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/device_server/devices/devicemanager.py +0 -0
  36. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/device_server/friendly_device_exceptions.py +0 -0
  37. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/device_server/rpc_handler.py +0 -0
  38. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/device_server/tests/__init__.py +0 -0
  39. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/device_server/tests/utils.py +0 -0
  40. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/file_writer/__init__.py +0 -0
  41. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/file_writer/async_writer.py +0 -0
  42. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/file_writer/cli/__init__.py +0 -0
  43. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/file_writer/cli/launch.py +0 -0
  44. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/file_writer/default_writer.py +0 -0
  45. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/file_writer/file_writer.py +0 -0
  46. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/file_writer/file_writer_manager.py +0 -0
  47. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/file_writer/merged_dicts.py +0 -0
  48. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/file_writer_plugins/__init__.py +0 -0
  49. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/file_writer_plugins/cSAXS.py +0 -0
  50. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/procedures/Containerfile.bec_linux_base +0 -0
  51. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/procedures/Containerfile.requirements +0 -0
  52. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/procedures/Containerfile.worker +0 -0
  53. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/procedures/__init__.py +0 -0
  54. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/procedures/_dev_runner.py +0 -0
  55. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/procedures/builtin_procedures.py +0 -0
  56. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/procedures/constants.py +0 -0
  57. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/procedures/container_utils.py +0 -0
  58. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/procedures/container_worker.py +0 -0
  59. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/procedures/manager.py +0 -0
  60. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/procedures/oop_worker_base.py +0 -0
  61. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/procedures/procedure_registry.py +0 -0
  62. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/procedures/protocol.py +0 -0
  63. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/procedures/subprocess_worker.py +0 -0
  64. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/procedures/worker_base.py +0 -0
  65. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_bundler/__init__.py +0 -0
  66. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_bundler/bec_emitter.py +0 -0
  67. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_bundler/cli/__init__.py +0 -0
  68. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_bundler/cli/launch.py +0 -0
  69. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_bundler/emitter.py +0 -0
  70. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_bundler/scan_bundler.py +0 -0
  71. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/__init__.py +0 -0
  72. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/beamline_state_manager.py +0 -0
  73. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/cli/__init__.py +0 -0
  74. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/cli/launch.py +0 -0
  75. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/direct_scan_worker.py +0 -0
  76. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/errors.py +0 -0
  77. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/generator_scan_worker.py +0 -0
  78. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/instruction_handler.py +0 -0
  79. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/path_optimization.py +0 -0
  80. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scan_assembler.py +0 -0
  81. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scan_guard.py +0 -0
  82. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scan_gui_models.py +0 -0
  83. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scan_manager.py +0 -0
  84. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scan_plugins/__init__.py +0 -0
  85. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scan_plugins/otf_scan.py +0 -0
  86. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scan_queue.py +0 -0
  87. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scan_server.py +0 -0
  88. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scan_stubs.py +0 -0
  89. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scan_worker.py +0 -0
  90. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/__init__.py +0 -0
  91. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/acquire.py +0 -0
  92. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/cont_line_scan.py +0 -0
  93. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/fermat_scan.py +0 -0
  94. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/grid_scan.py +0 -0
  95. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/hexagonal_scan.py +0 -0
  96. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/legacy_scans.py +0 -0
  97. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/line_scan.py +0 -0
  98. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/line_sweep_scan.py +0 -0
  99. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/list_scan.py +0 -0
  100. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/log_scan.py +0 -0
  101. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/move.py +0 -0
  102. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/multi_region_grid_scan.py +0 -0
  103. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/multi_region_line_scan.py +0 -0
  104. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/position_generators.py +0 -0
  105. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/round_roi_scan.py +0 -0
  106. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/round_scan.py +0 -0
  107. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/scan_actions.py +0 -0
  108. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/scan_argument_modifier.py +0 -0
  109. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/scan_base.py +0 -0
  110. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/scan_components.py +0 -0
  111. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/scan_modifier.py +0 -0
  112. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/time_scan.py +0 -0
  113. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/scans/updated_move.py +0 -0
  114. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/tests/__init__.py +0 -0
  115. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/tests/fixtures.py +0 -0
  116. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/tests/scan_fixtures.py +0 -0
  117. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/tests/scan_hook_tests.py +0 -0
  118. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/tests/utils.py +0 -0
  119. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scan_server/types.py +0 -0
  120. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scihub/__init__.py +0 -0
  121. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scihub/atlas/__init__.py +0 -0
  122. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scihub/atlas/atlas_active_client_emitter.py +0 -0
  123. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scihub/atlas/atlas_connector.py +0 -0
  124. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scihub/atlas/atlas_forwarder.py +0 -0
  125. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scihub/atlas/atlas_metadata_handler.py +0 -0
  126. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scihub/atlas/config_handler.py +0 -0
  127. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scihub/cli/__init__.py +0 -0
  128. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scihub/cli/launch.py +0 -0
  129. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scihub/scihub.py +0 -0
  130. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scihub/service_handler/__init__.py +0 -0
  131. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/scihub/service_handler/service_handler.py +0 -0
  132. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/test/__init__.py +0 -0
  133. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/test/actor_test_utils.py +0 -0
  134. {bec_server-3.146.2 → bec_server-3.147.0}/bec_server/test/helpers.py +0 -0
  135. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_actors/test_actors.py +0 -0
  136. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_bec_server_utils/test_main.py +0 -0
  137. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_bec_server_utils/test_service_handler.py +0 -0
  138. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_bec_server_utils/test_tmux_launch.py +0 -0
  139. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_data_processing/conftest.py +0 -0
  140. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_data_processing/test_dap_cli_launch.py +0 -0
  141. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_data_processing/test_dap_server.py +0 -0
  142. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_data_processing/test_dap_service_manager.py +0 -0
  143. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_data_processing/test_image_analysis_service.py +0 -0
  144. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_data_processing/test_lmfit1d_service.py +0 -0
  145. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_device_server/conftest.py +0 -0
  146. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_device_server/test_config_handler.py +0 -0
  147. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_device_server/test_device_instructions.py +0 -0
  148. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_device_server/test_device_serializer.py +0 -0
  149. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_device_server/test_device_server.py +0 -0
  150. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_device_server/test_device_server_cli_launch.py +0 -0
  151. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_device_server/test_rpc_handler.py +0 -0
  152. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_file_writer/conftest.py +0 -0
  153. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_file_writer/test_async_file_writer.py +0 -0
  154. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_file_writer/test_file_writer.py +0 -0
  155. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_file_writer/test_file_writer_cli_launch.py +0 -0
  156. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_file_writer/test_file_writer_manager.py +0 -0
  157. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_bundler/conftest.py +0 -0
  158. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_bundler/test_bec_emitter.py +0 -0
  159. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_bundler/test_scan_bundler.py +0 -0
  160. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_bundler/test_scan_bundler_cli_launch.py +0 -0
  161. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/conftest.py +0 -0
  162. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/__init__.py +0 -0
  163. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_acquire.py +0 -0
  164. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_cont_line_scan.py +0 -0
  165. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_fermat_scan.py +0 -0
  166. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_grid_scan.py +0 -0
  167. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_hexagonal_scan.py +0 -0
  168. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_line_scan.py +0 -0
  169. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_line_sweep_scan.py +0 -0
  170. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_list_scan.py +0 -0
  171. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_log_scan.py +0 -0
  172. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_move_scan.py +0 -0
  173. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_multi_region_grid_scan.py +0 -0
  174. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_multi_region_line_scan.py +0 -0
  175. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_position_generators.py +0 -0
  176. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_relative_scan_return_to_start.py +0 -0
  177. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_round_roi_scan.py +0 -0
  178. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_round_scan.py +0 -0
  179. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_scan_actions.py +0 -0
  180. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_scan_components.py +0 -0
  181. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_time_scan.py +0 -0
  182. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/scans_v4/test_updated_move_scan.py +0 -0
  183. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_beamline_state_manager.py +0 -0
  184. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_builtin_actor_manager.py +0 -0
  185. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_container_utils.py +0 -0
  186. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_direct_scan_worker.py +0 -0
  187. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_generator_scan_worker.py +0 -0
  188. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_instruction_handler.py +0 -0
  189. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_legacy_scans.py +0 -0
  190. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_path_optimization.py +0 -0
  191. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_procedure_container_worker.py +0 -0
  192. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_procedures.py +0 -0
  193. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_scan_argument_modifier.py +0 -0
  194. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_scan_assembler.py +0 -0
  195. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_scan_guard.py +0 -0
  196. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_scan_gui_models.py +0 -0
  197. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_scan_interlock.py +0 -0
  198. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_scan_modifier.py +0 -0
  199. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_scan_server_cli_launch.py +0 -0
  200. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_scan_server_queue.py +0 -0
  201. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_scan_server_scan_manager.py +0 -0
  202. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_scan_stub_status.py +0 -0
  203. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_scan_stubs.py +0 -0
  204. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scan_server/test_scan_worker.py +0 -0
  205. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scihub/conftest.py +0 -0
  206. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scihub/test_atlas_active_client_emitter.py +0 -0
  207. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scihub/test_atlas_config_handler.py +0 -0
  208. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scihub/test_atlas_connector.py +0 -0
  209. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scihub/test_atlas_forwarder.py +0 -0
  210. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scihub/test_atlas_metadata_handler.py +0 -0
  211. {bec_server-3.146.2 → bec_server-3.147.0}/tests/tests_scihub/test_scihub_cli_launch.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bec-server
3
- Version: 3.146.2
3
+ Version: 3.147.0
4
4
  Summary: BEC server
5
5
  Project-URL: Bug Tracker, https://github.com/bec-project/bec/issues
6
6
  Project-URL: Homepage, https://github.com/bec-project/bec
@@ -1,7 +1,8 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import TYPE_CHECKING
3
+ from typing import TYPE_CHECKING, Iterable, TypedDict
4
4
 
5
+ import numpy as np
5
6
  from ophyd import OphydObject
6
7
  from ophyd_devices.utils import bec_signals as bms
7
8
 
@@ -16,6 +17,11 @@ if TYPE_CHECKING: # pragma: no cover
16
17
  from bec_server.device_server.devices.devicemanager import DeviceManagerDS
17
18
 
18
19
 
20
+ class _AsyncSignalIndexState(TypedDict):
21
+ scan_id: str
22
+ indices: dict[str, int]
23
+
24
+
19
25
  class BECMessageHandler:
20
26
  """
21
27
  A message handler for the BEC device server that processes and emits messages related to device signals.
@@ -32,6 +38,7 @@ class BECMessageHandler:
32
38
  self.device_manager = device_manager
33
39
  self.connector: RedisConnector = device_manager.connector
34
40
  self.devices = device_manager.devices
41
+ self._async_signal_index_state: dict[tuple[str, str], _AsyncSignalIndexState] = {}
35
42
 
36
43
  def emit(self, obj: OphydObject, message: messages.BECMessage):
37
44
  """
@@ -156,15 +163,71 @@ class BECMessageHandler:
156
163
  f"Signal metadata is None for device {device_name} and signal {signal_name}."
157
164
  )
158
165
  return
166
+
167
+ indices = self._get_async_signal_indices(
168
+ obj=obj, scan_id=scan_id, signal_names=message.signals.keys()
169
+ )
170
+
171
+ # we augment the message metadata with the async signal indices so that
172
+ # downstream consumers can know which message corresponds to which async signal update
173
+ message.metadata["async_indices"] = indices
174
+
175
+ pipe = self.connector.pipeline()
159
176
  self.connector.xadd(
160
177
  MessageEndpoints.device_async_signal(
161
178
  scan_id=scan_id, device=device_name, signal=signal_name
162
179
  ),
163
180
  {"data": message},
164
181
  max_size=obj.signal_metadata.get("max_size", 1000),
182
+ pipe=pipe,
165
183
  expire=obj.signal_metadata.get("expire", 600), # default to 10 minutes (600 seconds)
166
184
  )
167
185
 
186
+ # NOTE: We are storing the shape information. This means that
187
+ # - a single value update will have shape [] (scalar)
188
+ # - an empty array will have shape [0]
189
+ # - a 1D array of length N will have shape [N]
190
+ # - a 2D array of shape (M, N) will have shape [M, N]
191
+ index_message = messages.DeviceAsyncSignalIndexMessage(
192
+ scan_id=scan_id,
193
+ device=device_name,
194
+ signal=signal_name,
195
+ shapes={
196
+ current_signal_name: list(np.shape(signal_data["value"]))
197
+ for current_signal_name, signal_data in message.signals.items()
198
+ },
199
+ indices=indices,
200
+ async_update=messages.DeviceAsyncUpdate.model_validate(
201
+ message.metadata["async_update"]
202
+ ),
203
+ )
204
+ self.connector.rpush(
205
+ MessageEndpoints.device_async_signal_index(
206
+ scan_id=scan_id, device=device_name, signal=signal_name
207
+ ),
208
+ index_message,
209
+ pipe=pipe,
210
+ expire=3600, # expire after 1 hour; note that this is longer than the async signal message itself
211
+ )
212
+ pipe.execute()
213
+
214
+ def _get_async_signal_indices(
215
+ self, obj: bms.DynamicSignal, scan_id: str, signal_names: Iterable[str]
216
+ ) -> dict[str, int]:
217
+ state_key = (obj.root.name, obj.name)
218
+ state = self._async_signal_index_state.get(state_key)
219
+ if state is None or state["scan_id"] != scan_id:
220
+ state = _AsyncSignalIndexState(scan_id=scan_id, indices={})
221
+ self._async_signal_index_state[state_key] = state
222
+
223
+ out = {}
224
+ indices = state["indices"]
225
+ for signal_name in signal_names:
226
+ current_index = indices.get(signal_name, -1) + 1
227
+ indices[signal_name] = current_index
228
+ out[signal_name] = current_index
229
+ return out
230
+
168
231
  def _get_scan_status_message(self) -> messages.ScanStatusMessage | None:
169
232
  """
170
233
  Get the current scan status message from the device manager.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "bec-server"
7
- version = "3.146.2"
7
+ version = "3.147.0"
8
8
  description = "BEC server"
9
9
  requires-python = ">=3.11"
10
10
  classifiers = [
@@ -132,6 +132,7 @@ Homepage = "https://github.com/bec-project/bec"
132
132
 
133
133
 
134
134
 
135
+
135
136
 
136
137
 
137
138
  [tool.hatch.build.targets.wheel]
@@ -24,13 +24,10 @@ def dm_with_devices_and_status(dm_with_devices):
24
24
  Fixture that adds the scan_info message to the device manager
25
25
  """
26
26
  device_manager = dm_with_devices
27
- with mock.patch.object(
28
- device_manager.scan_info, "msg", new_callable=mock.PropertyMock
29
- ) as mock_scan_info_msg:
30
- mock_scan_info_msg.return_value = messages.ScanStatusMessage(
31
- scan_id="12345", status="open", info={"num_points": 10, "RID": "RID123"}
32
- )
33
- yield device_manager
27
+ device_manager.scan_info.msg = messages.ScanStatusMessage(
28
+ scan_id="12345", status="open", info={"num_points": 10, "RID": "RID123"}
29
+ )
30
+ yield device_manager
34
31
 
35
32
 
36
33
  class ControllerMock:
@@ -421,7 +418,8 @@ def test_device_manager_ds_obj_callback_progress_signal_disabled_device(dm_with_
421
418
  [
422
419
  None,
423
420
  messages.DeviceMessage(
424
- signals={"async_signal": {"value": np.random.rand(10), "timestamp": time.time()}}
421
+ signals={"async_signal": {"value": np.random.rand(10), "timestamp": time.time()}},
422
+ metadata={"async_update": {"type": "add", "max_shape": [None]}},
425
423
  ),
426
424
  "some string",
427
425
  ],
@@ -446,7 +444,8 @@ def test_device_manager_ds_obj_callback_async_signal_incomplete_info(dm_with_dev
446
444
  dm_with_devices.devices.bec_signals_device.metadata = metadata
447
445
 
448
446
  msg = messages.DeviceMessage(
449
- signals={"async_signal": {"value": np.random.rand(10), "timestamp": time.time()}}
447
+ signals={"async_signal": {"value": np.random.rand(10), "timestamp": time.time()}},
448
+ metadata={"async_update": {"type": "add", "max_shape": [None]}},
450
449
  )
451
450
  with mock.patch.object(device_manager.connector, "xadd") as mock_xadd:
452
451
  device_manager._obj_callback_bec_message_signal(obj=device.async_signal, value=msg)
File without changes
File without changes