bec-server 4.1.2__tar.gz → 4.1.3__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.
- {bec_server-4.1.2 → bec_server-4.1.3}/PKG-INFO +1 -1
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/file_writer/async_writer.py +2 -1
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/file_writer/file_writer_manager.py +6 -4
- {bec_server-4.1.2 → bec_server-4.1.3}/pyproject.toml +1 -1
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_device_server/test_device_manager_ds.py +27 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_file_writer/test_file_writer_manager.py +95 -1
- {bec_server-4.1.2 → bec_server-4.1.3}/.gitignore +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/.zed/debug.json +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/README.md +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/actors/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/actors/actor.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/actors/builtin_actor_manager.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/actors/manager.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/actors/scan_interlock.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/actors/worker.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/bec_server_utils/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/bec_server_utils/launch.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/bec_server_utils/service_handler.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/bec_server_utils/subprocess_launch.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/bec_server_utils/tmux_launch.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/data_processing/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/data_processing/cli/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/data_processing/cli/launch.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/data_processing/dap_server.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/data_processing/dap_service.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/data_processing/dap_service_manager.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/data_processing/lmfit1d_service.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/device_server/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/device_server/bec_message_handler.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/device_server/cli/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/device_server/cli/launch.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/device_server/device_server.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/device_server/devices/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/device_server/devices/config_update_handler.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/device_server/devices/device_serializer.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/device_server/devices/devicemanager.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/device_server/friendly_device_exceptions.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/device_server/ophyd_callback_monitor.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/device_server/rpc_handler.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/device_server/tests/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/device_server/tests/utils.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/file_writer/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/file_writer/cli/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/file_writer/cli/launch.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/file_writer/default_writer.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/file_writer/file_writer.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/file_writer/merged_dicts.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/procedures/Containerfile.bec_linux_base +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/procedures/Containerfile.requirements +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/procedures/Containerfile.worker +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/procedures/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/procedures/_dev_runner.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/procedures/builtin_procedures.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/procedures/constants.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/procedures/container_utils.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/procedures/container_worker.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/procedures/manager.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/procedures/oop_worker_base.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/procedures/procedure_registry.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/procedures/protocol.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/procedures/subprocess_worker.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/procedures/worker_base.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_bundler/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_bundler/bec_emitter.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_bundler/cli/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_bundler/cli/launch.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_bundler/emitter.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_bundler/scan_bundler.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/beamline_state_manager.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/cli/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/cli/launch.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/device_lock_registry.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/direct_scan_worker.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/errors.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/instruction_handler.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scan_assembler.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scan_guard.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scan_manager.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scan_queue.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scan_server.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scan_worker.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/acquire.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/cont_line_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/device_rpc.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/fermat_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/grid_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/hexagonal_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/line_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/line_sweep_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/list_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/log_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/move.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/multi_region_grid_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/multi_region_line_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/path_optimization.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/position_generators.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/round_roi_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/round_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/scan_actions.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/scan_argument_modifier.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/scan_base.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/scan_components.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/scan_modifier.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/scan_status.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/time_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/updated_move.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/tests/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/tests/fixtures.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/tests/scan_fixtures.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/tests/scan_hook_tests.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/tests/utils.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scihub/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scihub/atlas/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scihub/atlas/atlas_active_client_emitter.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scihub/atlas/atlas_connector.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scihub/atlas/atlas_forwarder.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scihub/atlas/atlas_metadata_handler.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scihub/atlas/atlas_plugin_repo_emitter.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scihub/atlas/config_handler.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scihub/cli/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scihub/cli/launch.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scihub/scihub.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scihub/service_handler/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scihub/service_handler/service_handler.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/test/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/test/actor_test_utils.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/bec_server/test/helpers.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_actors/test_actors.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_bec_server_utils/test_main.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_bec_server_utils/test_service_handler.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_bec_server_utils/test_subprocess_launch.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_bec_server_utils/test_tmux_launch.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_data_processing/conftest.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_data_processing/test_dap_cli_launch.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_data_processing/test_dap_server.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_data_processing/test_dap_service_manager.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_data_processing/test_lmfit1d_service.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_device_server/conftest.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_device_server/test_config_handler.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_device_server/test_device_instructions.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_device_server/test_device_serializer.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_device_server/test_device_server.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_device_server/test_device_server_cli_launch.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_device_server/test_ophyd_callback_monitor.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_device_server/test_rpc_handler.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_file_writer/conftest.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_file_writer/test_async_file_writer.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_file_writer/test_file_writer.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_file_writer/test_file_writer_cli_launch.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_bundler/conftest.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_bundler/test_bec_emitter.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_bundler/test_scan_bundler.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_bundler/test_scan_bundler_cli_launch.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/conftest.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/__init__.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_acquire.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_cont_line_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_device_rpc_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_fermat_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_grid_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_hexagonal_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_line_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_line_sweep_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_list_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_log_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_move_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_multi_region_grid_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_multi_region_line_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_position_generators.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_relative_scan_return_to_start.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_round_roi_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_round_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_scan_actions.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_scan_components.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_scan_status.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_time_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_updated_move_scan.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_beamline_state_manager.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_builtin_actor_manager.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_container_utils.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_device_lock_registry.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_direct_scan_worker.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_instruction_handler.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_path_optimization.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_procedure_container_worker.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_procedures.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_scan_argument_modifier.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_scan_assembler.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_scan_fixture_imports.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_scan_guard.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_scan_interlock.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_scan_modifier.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_scan_server_cli_launch.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_scan_server_queue.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_scan_server_scan_manager.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_scan_worker.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scihub/conftest.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scihub/test_atlas_active_client_emitter.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scihub/test_atlas_config_handler.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scihub/test_atlas_connector.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scihub/test_atlas_forwarder.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scihub/test_atlas_metadata_handler.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scihub/test_atlas_plugin_repo_emitter.py +0 -0
- {bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scihub/test_scihub_cli_launch.py +0 -0
|
@@ -111,6 +111,7 @@ class AsyncWriter(threading.Thread):
|
|
|
111
111
|
self._written_signals = defaultdict(set)
|
|
112
112
|
self.file_handle = None
|
|
113
113
|
self.cursor = defaultdict(dict)
|
|
114
|
+
self.error_info: messages.ErrorInfo | None = None
|
|
114
115
|
|
|
115
116
|
@property
|
|
116
117
|
def written_signals(self) -> dict[str, list[str]]:
|
|
@@ -215,13 +216,13 @@ class AsyncWriter(threading.Thread):
|
|
|
215
216
|
# pylint: disable=broad-except
|
|
216
217
|
except Exception:
|
|
217
218
|
content = traceback.format_exc()
|
|
218
|
-
# self.send_file_message(done=True, successful=False)
|
|
219
219
|
logger.error(f"Error writing async data file {self.tmp_file_path}: {content}")
|
|
220
220
|
error_info = messages.ErrorInfo(
|
|
221
221
|
error_message=f"Error writing async data file {self.tmp_file_path}",
|
|
222
222
|
compact_error_message=traceback.format_exc(limit=0),
|
|
223
223
|
exception_type="AsyncWriterError",
|
|
224
224
|
)
|
|
225
|
+
self.error_info = error_info
|
|
225
226
|
self.connector.raise_alarm(
|
|
226
227
|
severity=Alarms.WARNING,
|
|
227
228
|
info=error_info,
|
|
@@ -422,6 +422,8 @@ class FileWriterManager(BECService):
|
|
|
422
422
|
file_suffix = "master"
|
|
423
423
|
|
|
424
424
|
start_time = time.time()
|
|
425
|
+
successful = storage.async_writer is None or storage.async_writer.error_info is None
|
|
426
|
+
file_handle = None
|
|
425
427
|
|
|
426
428
|
try:
|
|
427
429
|
file_path = get_full_path(
|
|
@@ -429,7 +431,6 @@ class FileWriterManager(BECService):
|
|
|
429
431
|
name=file_suffix,
|
|
430
432
|
log_if_dir_does_not_exist=False,
|
|
431
433
|
)
|
|
432
|
-
successful = True
|
|
433
434
|
written_async_signals = (
|
|
434
435
|
storage.async_writer.written_signals if storage.async_writer else None
|
|
435
436
|
)
|
|
@@ -491,6 +492,9 @@ class FileWriterManager(BECService):
|
|
|
491
492
|
expire=3600,
|
|
492
493
|
)
|
|
493
494
|
|
|
495
|
+
if not successful:
|
|
496
|
+
return
|
|
497
|
+
|
|
494
498
|
history_msg = messages.ScanHistoryMessage(
|
|
495
499
|
scan_id=scan_id,
|
|
496
500
|
scan_number=storage.scan_number,
|
|
@@ -509,6 +513,4 @@ class FileWriterManager(BECService):
|
|
|
509
513
|
self.connector.xadd(
|
|
510
514
|
topic=MessageEndpoints.scan_history(), msg_dict={"data": history_msg}, max_size=10000
|
|
511
515
|
)
|
|
512
|
-
|
|
513
|
-
logger.success(f"Finished writing file {file_path}.")
|
|
514
|
-
return
|
|
516
|
+
logger.success(f"Finished writing file {file_path}.")
|
|
@@ -12,6 +12,7 @@ from ophyd_devices.tests.utils import patched_device
|
|
|
12
12
|
|
|
13
13
|
from bec_lib import messages
|
|
14
14
|
from bec_lib.bec_errors import DeviceConfigError
|
|
15
|
+
from bec_lib.connector import MessageObject
|
|
15
16
|
from bec_lib.endpoints import MessageEndpoints
|
|
16
17
|
from bec_server.device_server.devices.config_update_handler import ConfigUpdateHandler
|
|
17
18
|
from bec_server.device_server.devices.devicemanager import DeviceManagerDS
|
|
@@ -20,6 +21,32 @@ from bec_server.device_server.devices.devicemanager import DeviceManagerDS
|
|
|
20
21
|
# pylint: disable=protected-access
|
|
21
22
|
|
|
22
23
|
|
|
24
|
+
@pytest.mark.parametrize("device_manager_class", [DeviceManagerDS])
|
|
25
|
+
@pytest.mark.parametrize("metadata", [{}, {"RID": "reload-request"}])
|
|
26
|
+
def test_reload_notification_does_not_change_device_server_status(device_manager, metadata):
|
|
27
|
+
device_manager._service._service_name = "DeviceServer"
|
|
28
|
+
msg = messages.DeviceConfigMessage(action="reload", config={}, metadata=metadata)
|
|
29
|
+
with (
|
|
30
|
+
mock.patch.object(device_manager, "update_status") as update_status,
|
|
31
|
+
mock.patch.object(device_manager, "_reload_action") as reload_action,
|
|
32
|
+
mock.patch.object(device_manager.connector, "lpush") as lpush,
|
|
33
|
+
):
|
|
34
|
+
device_manager._device_config_update_callback(MessageObject(value=msg, topic=""))
|
|
35
|
+
|
|
36
|
+
update_status.assert_not_called()
|
|
37
|
+
reload_action.assert_not_called()
|
|
38
|
+
if metadata:
|
|
39
|
+
lpush.assert_called_once_with(
|
|
40
|
+
MessageEndpoints.service_response(metadata["RID"]),
|
|
41
|
+
messages.ServiceResponseMessage(
|
|
42
|
+
response={"accepted": True, "service": device_manager._service._service_name}
|
|
43
|
+
),
|
|
44
|
+
expire=100,
|
|
45
|
+
)
|
|
46
|
+
else:
|
|
47
|
+
lpush.assert_not_called()
|
|
48
|
+
|
|
49
|
+
|
|
23
50
|
@pytest.fixture
|
|
24
51
|
def dm_with_devices_and_status(dm_with_devices):
|
|
25
52
|
"""
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import os
|
|
3
3
|
import threading
|
|
4
4
|
import time
|
|
5
|
+
from pathlib import Path
|
|
5
6
|
from unittest import mock
|
|
6
7
|
|
|
7
8
|
import numpy as np
|
|
@@ -15,6 +16,7 @@ from bec_lib.redis_connector import MessageObject
|
|
|
15
16
|
from bec_lib.service_config import ServiceConfig
|
|
16
17
|
from bec_lib.tests.utils import ConnectorMock
|
|
17
18
|
from bec_server.file_writer import FileWriterManager
|
|
19
|
+
from bec_server.file_writer.async_writer import AsyncWriter
|
|
18
20
|
from bec_server.file_writer.file_writer import HDF5FileWriter
|
|
19
21
|
from bec_server.file_writer.file_writer_manager import ScanStorage
|
|
20
22
|
|
|
@@ -242,7 +244,7 @@ def test_write_file(file_writer_manager_mock, scan_storage_mock):
|
|
|
242
244
|
def test_write_file_forwards_written_async_signals(file_writer_manager_mock, scan_storage_mock):
|
|
243
245
|
file_manager = file_writer_manager_mock
|
|
244
246
|
scan_storage_mock.async_writer = mock.Mock(
|
|
245
|
-
written_signals={"waveform": ["waveform_data"]}, file_handle=None
|
|
247
|
+
written_signals={"waveform": ["waveform_data"]}, file_handle=None, error_info=None
|
|
246
248
|
)
|
|
247
249
|
file_manager.scan_storage["scan_id"] = scan_storage_mock
|
|
248
250
|
|
|
@@ -839,3 +841,95 @@ def test_subscriptions_buffer_early_notifications(file_writer_manager_mock, conn
|
|
|
839
841
|
assert manager.scan_storage["scan_id"].file_references == {"eiger": file_msg}
|
|
840
842
|
assert manager._pending_baseline_writes == {}
|
|
841
843
|
assert manager._pending_file_references == {}
|
|
844
|
+
|
|
845
|
+
|
|
846
|
+
@pytest.mark.parametrize("failure_stage", ["poll", "write", "final_poll", None])
|
|
847
|
+
@pytest.mark.parametrize("finalization_fails", [False, True])
|
|
848
|
+
def test_async_failure_survives_finalization(
|
|
849
|
+
file_writer_manager_mock,
|
|
850
|
+
scan_storage_mock,
|
|
851
|
+
tmp_path,
|
|
852
|
+
failure_stage,
|
|
853
|
+
finalization_fails,
|
|
854
|
+
request,
|
|
855
|
+
):
|
|
856
|
+
manager = file_writer_manager_mock
|
|
857
|
+
path = str(tmp_path / "master.h5")
|
|
858
|
+
writer = AsyncWriter(path, "scan_id", 10, manager.connector, ["det"], [])
|
|
859
|
+
|
|
860
|
+
def close_file():
|
|
861
|
+
if writer.file_handle is not None:
|
|
862
|
+
writer.file_handle.close()
|
|
863
|
+
|
|
864
|
+
request.addfinalizer(close_file)
|
|
865
|
+
scan_storage_mock.async_writer = writer
|
|
866
|
+
manager.scan_storage["scan_id"] = scan_storage_mock
|
|
867
|
+
data = {
|
|
868
|
+
"det": [
|
|
869
|
+
messages.DeviceMessage(
|
|
870
|
+
signals={"det": {"value": [1], "timestamp": 1}},
|
|
871
|
+
metadata={"async_update": {"type": "add", "max_shape": [None]}},
|
|
872
|
+
)
|
|
873
|
+
]
|
|
874
|
+
}
|
|
875
|
+
failure = RuntimeError("async acquisition failed")
|
|
876
|
+
|
|
877
|
+
def poll(poll_timeout=500):
|
|
878
|
+
if writer.written_signals:
|
|
879
|
+
if failure_stage in ("poll", "final_poll"):
|
|
880
|
+
raise failure
|
|
881
|
+
writer.stop()
|
|
882
|
+
return None
|
|
883
|
+
return data
|
|
884
|
+
|
|
885
|
+
original_write = writer.write_data
|
|
886
|
+
|
|
887
|
+
def write(*args, **kwargs):
|
|
888
|
+
original_write(*args, **kwargs)
|
|
889
|
+
if failure_stage == "write":
|
|
890
|
+
raise failure
|
|
891
|
+
if failure_stage == "final_poll":
|
|
892
|
+
writer.stop()
|
|
893
|
+
|
|
894
|
+
with (
|
|
895
|
+
mock.patch.object(writer, "poll_data", side_effect=poll),
|
|
896
|
+
mock.patch.object(writer, "write_data", side_effect=write),
|
|
897
|
+
mock.patch.object(manager.connector, "raise_alarm"),
|
|
898
|
+
):
|
|
899
|
+
# Error propagation does not require a background thread or a timing deadline.
|
|
900
|
+
writer.run()
|
|
901
|
+
assert writer.written_signals == {"det": ["det"]}
|
|
902
|
+
assert writer.file_handle["/entry/collection/devices/det/det/value"][:].tolist() == [1]
|
|
903
|
+
if failure_stage:
|
|
904
|
+
assert "async acquisition failed" in writer.error_info.compact_error_message
|
|
905
|
+
else:
|
|
906
|
+
assert writer.error_info is None
|
|
907
|
+
with (
|
|
908
|
+
mock.patch("bec_server.file_writer.file_writer_manager.get_full_path", return_value=path),
|
|
909
|
+
mock.patch.object(
|
|
910
|
+
manager.file_writer,
|
|
911
|
+
"write",
|
|
912
|
+
side_effect=RuntimeError("metadata failed") if finalization_fails else None,
|
|
913
|
+
) as finalize,
|
|
914
|
+
mock.patch.object(manager.connector, "set_and_publish") as publish,
|
|
915
|
+
mock.patch.object(manager.connector, "xadd") as xadd,
|
|
916
|
+
mock.patch.object(manager.connector, "raise_alarm"),
|
|
917
|
+
):
|
|
918
|
+
manager.write_file("scan_id")
|
|
919
|
+
finalize.assert_called_once()
|
|
920
|
+
outcome = publish.call_args.args[1]
|
|
921
|
+
assert outcome.done is True
|
|
922
|
+
assert outcome.successful is (failure_stage is None and not finalization_fails)
|
|
923
|
+
# The logger may also publish through this connector, depending on test order.
|
|
924
|
+
history_calls = [
|
|
925
|
+
call
|
|
926
|
+
for call in xadd.call_args_list
|
|
927
|
+
if call.kwargs.get("topic") == MessageEndpoints.scan_history()
|
|
928
|
+
]
|
|
929
|
+
if outcome.successful:
|
|
930
|
+
assert len(history_calls) == 1
|
|
931
|
+
assert history_calls[0].kwargs["msg_dict"]["data"].file_path == path
|
|
932
|
+
else:
|
|
933
|
+
assert not history_calls
|
|
934
|
+
assert not writer.file_handle.id.valid
|
|
935
|
+
assert Path(path).exists()
|
|
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
|
{bec_server-4.1.2 → bec_server-4.1.3}/bec_server/device_server/devices/config_update_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bec_server-4.1.2 → bec_server-4.1.3}/bec_server/device_server/friendly_device_exceptions.py
RENAMED
|
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
|
|
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
|
{bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/multi_region_grid_scan.py
RENAMED
|
File without changes
|
{bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/multi_region_line_scan.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scan_server/scans/scan_argument_modifier.py
RENAMED
|
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
|
{bec_server-4.1.2 → bec_server-4.1.3}/bec_server/scihub/atlas/atlas_active_client_emitter.py
RENAMED
|
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
|
{bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_bec_server_utils/test_subprocess_launch.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_data_processing/test_dap_service_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_device_server/test_device_server_cli_launch.py
RENAMED
|
File without changes
|
{bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_device_server/test_ophyd_callback_monitor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_file_writer/test_file_writer_cli_launch.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_bundler/test_scan_bundler_cli_launch.py
RENAMED
|
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
|
{bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_multi_region_grid_scan.py
RENAMED
|
File without changes
|
{bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_multi_region_line_scan.py
RENAMED
|
File without changes
|
{bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_position_generators.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/scans/test_updated_move_scan.py
RENAMED
|
File without changes
|
{bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_beamline_state_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_procedure_container_worker.py
RENAMED
|
File without changes
|
|
File without changes
|
{bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_scan_argument_modifier.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_scan_server_cli_launch.py
RENAMED
|
File without changes
|
|
File without changes
|
{bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scan_server/test_scan_server_scan_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bec_server-4.1.2 → bec_server-4.1.3}/tests/tests_scihub/test_atlas_active_client_emitter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|