bec-server 4.0.1__tar.gz → 4.0.2__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 (207) hide show
  1. {bec_server-4.0.1 → bec_server-4.0.2}/PKG-INFO +1 -1
  2. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/file_writer/async_writer.py +16 -4
  3. {bec_server-4.0.1 → bec_server-4.0.2}/pyproject.toml +1 -1
  4. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_file_writer/test_async_file_writer.py +56 -0
  5. {bec_server-4.0.1 → bec_server-4.0.2}/.gitignore +0 -0
  6. {bec_server-4.0.1 → bec_server-4.0.2}/.zed/debug.json +0 -0
  7. {bec_server-4.0.1 → bec_server-4.0.2}/README.md +0 -0
  8. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/__init__.py +0 -0
  9. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/actors/__init__.py +0 -0
  10. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/actors/actor.py +0 -0
  11. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/actors/builtin_actor_manager.py +0 -0
  12. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/actors/manager.py +0 -0
  13. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/actors/scan_interlock.py +0 -0
  14. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/actors/worker.py +0 -0
  15. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/bec_server_utils/__init__.py +0 -0
  16. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/bec_server_utils/launch.py +0 -0
  17. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/bec_server_utils/service_handler.py +0 -0
  18. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/bec_server_utils/subprocess_launch.py +0 -0
  19. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/bec_server_utils/tmux_launch.py +0 -0
  20. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/data_processing/__init__.py +0 -0
  21. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/data_processing/cli/__init__.py +0 -0
  22. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/data_processing/cli/launch.py +0 -0
  23. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/data_processing/dap_server.py +0 -0
  24. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/data_processing/dap_service.py +0 -0
  25. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/data_processing/dap_service_manager.py +0 -0
  26. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/data_processing/lmfit1d_service.py +0 -0
  27. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/device_server/__init__.py +0 -0
  28. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/device_server/bec_message_handler.py +0 -0
  29. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/device_server/cli/__init__.py +0 -0
  30. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/device_server/cli/launch.py +0 -0
  31. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/device_server/device_server.py +0 -0
  32. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/device_server/devices/__init__.py +0 -0
  33. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/device_server/devices/config_update_handler.py +0 -0
  34. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/device_server/devices/device_serializer.py +0 -0
  35. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/device_server/devices/devicemanager.py +0 -0
  36. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/device_server/friendly_device_exceptions.py +0 -0
  37. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/device_server/ophyd_callback_monitor.py +0 -0
  38. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/device_server/rpc_handler.py +0 -0
  39. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/device_server/tests/__init__.py +0 -0
  40. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/device_server/tests/utils.py +0 -0
  41. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/file_writer/__init__.py +0 -0
  42. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/file_writer/cli/__init__.py +0 -0
  43. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/file_writer/cli/launch.py +0 -0
  44. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/file_writer/default_writer.py +0 -0
  45. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/file_writer/file_writer.py +0 -0
  46. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/file_writer/file_writer_manager.py +0 -0
  47. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/file_writer/merged_dicts.py +0 -0
  48. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/procedures/Containerfile.bec_linux_base +0 -0
  49. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/procedures/Containerfile.requirements +0 -0
  50. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/procedures/Containerfile.worker +0 -0
  51. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/procedures/__init__.py +0 -0
  52. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/procedures/_dev_runner.py +0 -0
  53. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/procedures/builtin_procedures.py +0 -0
  54. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/procedures/constants.py +0 -0
  55. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/procedures/container_utils.py +0 -0
  56. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/procedures/container_worker.py +0 -0
  57. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/procedures/manager.py +0 -0
  58. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/procedures/oop_worker_base.py +0 -0
  59. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/procedures/procedure_registry.py +0 -0
  60. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/procedures/protocol.py +0 -0
  61. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/procedures/subprocess_worker.py +0 -0
  62. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/procedures/worker_base.py +0 -0
  63. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_bundler/__init__.py +0 -0
  64. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_bundler/bec_emitter.py +0 -0
  65. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_bundler/cli/__init__.py +0 -0
  66. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_bundler/cli/launch.py +0 -0
  67. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_bundler/emitter.py +0 -0
  68. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_bundler/scan_bundler.py +0 -0
  69. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/__init__.py +0 -0
  70. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/beamline_state_manager.py +0 -0
  71. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/cli/__init__.py +0 -0
  72. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/cli/launch.py +0 -0
  73. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/device_lock_registry.py +0 -0
  74. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/direct_scan_worker.py +0 -0
  75. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/errors.py +0 -0
  76. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/instruction_handler.py +0 -0
  77. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scan_assembler.py +0 -0
  78. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scan_guard.py +0 -0
  79. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scan_manager.py +0 -0
  80. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scan_queue.py +0 -0
  81. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scan_server.py +0 -0
  82. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scan_worker.py +0 -0
  83. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/__init__.py +0 -0
  84. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/acquire.py +0 -0
  85. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/cont_line_scan.py +0 -0
  86. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/device_rpc.py +0 -0
  87. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/fermat_scan.py +0 -0
  88. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/grid_scan.py +0 -0
  89. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/hexagonal_scan.py +0 -0
  90. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/line_scan.py +0 -0
  91. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/line_sweep_scan.py +0 -0
  92. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/list_scan.py +0 -0
  93. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/log_scan.py +0 -0
  94. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/move.py +0 -0
  95. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/multi_region_grid_scan.py +0 -0
  96. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/multi_region_line_scan.py +0 -0
  97. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/path_optimization.py +0 -0
  98. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/position_generators.py +0 -0
  99. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/round_roi_scan.py +0 -0
  100. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/round_scan.py +0 -0
  101. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/scan_actions.py +0 -0
  102. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/scan_argument_modifier.py +0 -0
  103. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/scan_base.py +0 -0
  104. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/scan_components.py +0 -0
  105. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/scan_modifier.py +0 -0
  106. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/scan_status.py +0 -0
  107. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/time_scan.py +0 -0
  108. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/scans/updated_move.py +0 -0
  109. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/tests/__init__.py +0 -0
  110. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/tests/fixtures.py +0 -0
  111. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/tests/scan_fixtures.py +0 -0
  112. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/tests/scan_hook_tests.py +0 -0
  113. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scan_server/tests/utils.py +0 -0
  114. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scihub/__init__.py +0 -0
  115. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scihub/atlas/__init__.py +0 -0
  116. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scihub/atlas/atlas_active_client_emitter.py +0 -0
  117. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scihub/atlas/atlas_connector.py +0 -0
  118. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scihub/atlas/atlas_forwarder.py +0 -0
  119. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scihub/atlas/atlas_metadata_handler.py +0 -0
  120. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scihub/atlas/atlas_plugin_repo_emitter.py +0 -0
  121. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scihub/atlas/config_handler.py +0 -0
  122. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scihub/cli/__init__.py +0 -0
  123. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scihub/cli/launch.py +0 -0
  124. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scihub/scihub.py +0 -0
  125. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scihub/service_handler/__init__.py +0 -0
  126. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/scihub/service_handler/service_handler.py +0 -0
  127. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/test/__init__.py +0 -0
  128. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/test/actor_test_utils.py +0 -0
  129. {bec_server-4.0.1 → bec_server-4.0.2}/bec_server/test/helpers.py +0 -0
  130. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_actors/test_actors.py +0 -0
  131. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_bec_server_utils/test_main.py +0 -0
  132. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_bec_server_utils/test_service_handler.py +0 -0
  133. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_bec_server_utils/test_subprocess_launch.py +0 -0
  134. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_bec_server_utils/test_tmux_launch.py +0 -0
  135. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_data_processing/conftest.py +0 -0
  136. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_data_processing/test_dap_cli_launch.py +0 -0
  137. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_data_processing/test_dap_server.py +0 -0
  138. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_data_processing/test_dap_service_manager.py +0 -0
  139. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_data_processing/test_lmfit1d_service.py +0 -0
  140. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_device_server/conftest.py +0 -0
  141. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_device_server/test_config_handler.py +0 -0
  142. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_device_server/test_device_instructions.py +0 -0
  143. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_device_server/test_device_manager_ds.py +0 -0
  144. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_device_server/test_device_serializer.py +0 -0
  145. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_device_server/test_device_server.py +0 -0
  146. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_device_server/test_device_server_cli_launch.py +0 -0
  147. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_device_server/test_ophyd_callback_monitor.py +0 -0
  148. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_device_server/test_rpc_handler.py +0 -0
  149. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_file_writer/conftest.py +0 -0
  150. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_file_writer/test_file_writer.py +0 -0
  151. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_file_writer/test_file_writer_cli_launch.py +0 -0
  152. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_file_writer/test_file_writer_manager.py +0 -0
  153. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_bundler/conftest.py +0 -0
  154. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_bundler/test_bec_emitter.py +0 -0
  155. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_bundler/test_scan_bundler.py +0 -0
  156. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_bundler/test_scan_bundler_cli_launch.py +0 -0
  157. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/conftest.py +0 -0
  158. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/__init__.py +0 -0
  159. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_acquire.py +0 -0
  160. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_cont_line_scan.py +0 -0
  161. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_device_rpc_scan.py +0 -0
  162. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_fermat_scan.py +0 -0
  163. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_grid_scan.py +0 -0
  164. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_hexagonal_scan.py +0 -0
  165. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_line_scan.py +0 -0
  166. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_line_sweep_scan.py +0 -0
  167. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_list_scan.py +0 -0
  168. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_log_scan.py +0 -0
  169. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_move_scan.py +0 -0
  170. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_multi_region_grid_scan.py +0 -0
  171. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_multi_region_line_scan.py +0 -0
  172. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_position_generators.py +0 -0
  173. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_relative_scan_return_to_start.py +0 -0
  174. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_round_roi_scan.py +0 -0
  175. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_round_scan.py +0 -0
  176. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_scan_actions.py +0 -0
  177. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_scan_components.py +0 -0
  178. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_scan_status.py +0 -0
  179. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_time_scan.py +0 -0
  180. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/scans/test_updated_move_scan.py +0 -0
  181. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_beamline_state_manager.py +0 -0
  182. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_builtin_actor_manager.py +0 -0
  183. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_container_utils.py +0 -0
  184. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_device_lock_registry.py +0 -0
  185. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_direct_scan_worker.py +0 -0
  186. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_instruction_handler.py +0 -0
  187. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_path_optimization.py +0 -0
  188. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_procedure_container_worker.py +0 -0
  189. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_procedures.py +0 -0
  190. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_scan_argument_modifier.py +0 -0
  191. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_scan_assembler.py +0 -0
  192. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_scan_fixture_imports.py +0 -0
  193. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_scan_guard.py +0 -0
  194. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_scan_interlock.py +0 -0
  195. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_scan_modifier.py +0 -0
  196. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_scan_server_cli_launch.py +0 -0
  197. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_scan_server_queue.py +0 -0
  198. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_scan_server_scan_manager.py +0 -0
  199. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scan_server/test_scan_worker.py +0 -0
  200. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scihub/conftest.py +0 -0
  201. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scihub/test_atlas_active_client_emitter.py +0 -0
  202. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scihub/test_atlas_config_handler.py +0 -0
  203. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scihub/test_atlas_connector.py +0 -0
  204. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scihub/test_atlas_forwarder.py +0 -0
  205. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scihub/test_atlas_metadata_handler.py +0 -0
  206. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scihub/test_atlas_plugin_repo_emitter.py +0 -0
  207. {bec_server-4.0.1 → bec_server-4.0.2}/tests/tests_scihub/test_scihub_cli_launch.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: bec-server
3
- Version: 4.0.1
3
+ Version: 4.0.2
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
@@ -303,7 +303,12 @@ class AsyncWriter(threading.Thread):
303
303
  if key == "value":
304
304
  self.write_value_data(signal_group, value, async_update)
305
305
  elif key == "timestamp":
306
- self.write_timestamp_data(signal_group, value)
306
+ self.write_timestamp_data(
307
+ signal_group,
308
+ value,
309
+ replace=isinstance(async_update, dict)
310
+ and async_update.get("type") == "replace",
311
+ )
307
312
  else: # pragma: no cover
308
313
  # this should never happen as the keys are fixed in the pydantic model
309
314
  msg = f"Unknown key: {key}. Data will not be written."
@@ -354,7 +359,7 @@ class AsyncWriter(threading.Thread):
354
359
 
355
360
  elif update_type == "replace":
356
361
  # store the data to be written after the scan is complete
357
- self.device_data_replace[signal_group.name] = value
362
+ self.device_data_replace[signal_group.name] = np.asarray(value)
358
363
  else:
359
364
  msg = f"Unknown async update type: {update_type}. Data will not be written."
360
365
  self.connector.raise_alarm(
@@ -578,19 +583,26 @@ class AsyncWriter(threading.Thread):
578
583
  )
579
584
  self.cursor[signal_group.name][row_index] = value.shape[1]
580
585
 
581
- def write_timestamp_data(self, signal_group, value):
586
+ def write_timestamp_data(
587
+ self, signal_group: h5py.Group, value: Any, replace: bool = False
588
+ ) -> None:
582
589
  """
583
590
  Write the timestamp data to the file.
584
591
  Timestamp data is always written as a 1D array, irrespective of the async update type.
592
+ Replacement updates retain only the latest timestamps.
585
593
 
586
594
  Args:
587
595
  signal_group (h5py.Group): The group to write the data to
588
- value (list): The timestamp data to write
596
+ value (Any): The timestamp data to write
597
+ replace (bool): Whether to replace existing timestamps instead of appending
589
598
  """
590
599
  if not isinstance(value, (list, np.ndarray)):
591
600
  value = [value]
592
601
  if "timestamp" not in signal_group:
593
602
  create_dataset_safe(signal_group, "timestamp", data=value, maxshape=(None,))
603
+ elif replace:
604
+ signal_group["timestamp"].resize((len(value),))
605
+ signal_group["timestamp"][:] = value
594
606
  else:
595
607
  signal_group["timestamp"].resize((len(signal_group["timestamp"]) + len(value),))
596
608
  signal_group["timestamp"][-len(value) :] = value
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "bec-server"
7
- version = "4.0.1"
7
+ version = "4.0.2"
8
8
  description = "BEC server"
9
9
  requires-python = ">=3.11"
10
10
  classifiers = [
@@ -591,9 +591,65 @@ def test_async_writer_replace(async_writer, data):
591
591
  # read the data back
592
592
  with h5py.File(async_writer.file_path, "r") as f:
593
593
  out = f[async_writer.BASE_PATH]["monitor_async"]["monitor_async"]["value"][:]
594
+ timestamps = f[async_writer.BASE_PATH]["monitor_async"]["monitor_async"]["timestamp"][:]
594
595
 
595
596
  assert out.shape == (10,)
596
597
  assert np.allclose(out, data[-1].signals["monitor_async"]["value"])
598
+ assert np.array_equal(timestamps, [data[-1].signals["monitor_async"]["timestamp"]])
599
+
600
+
601
+ @pytest.mark.parametrize(
602
+ "values",
603
+ [
604
+ (0, 7),
605
+ (0.0, 1.2),
606
+ (False, True),
607
+ (np.int64(0), np.int64(7)),
608
+ (np.float64(0.0), np.float64(1.2)),
609
+ ],
610
+ )
611
+ def test_async_writer_replace_scalar(async_writer, values):
612
+ """Write only the latest scalar value and timestamp after scan completion."""
613
+ for timestamp, value in enumerate(values, start=1):
614
+ message = messages.DeviceMessage(
615
+ signals={"monitor_async": {"value": value, "timestamp": float(timestamp)}},
616
+ metadata={"async_update": {"type": "replace"}},
617
+ )
618
+ async_writer.write_data({"monitor_async": [message]})
619
+
620
+ group = async_writer.file_handle[f"{async_writer.BASE_PATH}/monitor_async/monitor_async"]
621
+ try:
622
+ assert "value" not in group
623
+ async_writer.write_data({}, write_replace=True)
624
+ assert group["value"].shape == ()
625
+ assert group["value"][()] == values[-1]
626
+ assert np.array_equal(group["timestamp"][:], [2.0])
627
+ finally:
628
+ async_writer.file_handle.close()
629
+
630
+
631
+ @pytest.mark.parametrize("update_type", ["replace", "add", "add_slice"])
632
+ @pytest.mark.parametrize("timestamps", [[1, 2, 3], [1]])
633
+ def test_async_writer_timestamp_aggregation(async_writer, update_type, timestamps):
634
+ """Keep replacement timestamps together and preserve append behavior for other updates."""
635
+ metadata = {"type": update_type}
636
+ if update_type == "add":
637
+ metadata["max_shape"] = [None]
638
+ elif update_type == "add_slice":
639
+ metadata.update(max_shape=[None, None], index=0)
640
+
641
+ for timestamp in (timestamps, [4, 5]):
642
+ message = messages.DeviceMessage(
643
+ signals={"monitor_async": {"value": np.array([6, 7]), "timestamp": timestamp}},
644
+ metadata={"async_update": metadata},
645
+ )
646
+ async_writer.write_data({"monitor_async": [message]})
647
+ async_writer.write_data({}, write_replace=True)
648
+
649
+ group = async_writer.file_handle[f"{async_writer.BASE_PATH}/monitor_async/monitor_async"]
650
+ expected = [4, 5] if update_type == "replace" else timestamps + [4, 5]
651
+ assert np.array_equal(group["timestamp"][:], expected)
652
+ async_writer.file_handle.close()
597
653
 
598
654
 
599
655
  def test_async_writer_async_signal(async_writer):
File without changes
File without changes
File without changes