bec-server 2.9.4__tar.gz → 2.9.6__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 (115) hide show
  1. {bec_server-2.9.4 → bec_server-2.9.6}/PKG-INFO +1 -1
  2. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scan_queue.py +2 -2
  3. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/scibec/scibec_connector.py +8 -12
  4. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/scibec/scibec_metadata_handler.py +77 -77
  5. {bec_server-2.9.4 → bec_server-2.9.6}/pyproject.toml +1 -1
  6. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_server/test_scan_server_queue.py +19 -0
  7. bec_server-2.9.6/tests/tests_scihub/conftest.py +49 -0
  8. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scihub/test_scibec_connector.py +6 -25
  9. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scihub/test_scibec_metadata_handler.py +21 -43
  10. bec_server-2.9.4/tests/tests_scihub/conftest.py +0 -12
  11. {bec_server-2.9.4 → bec_server-2.9.6}/.gitignore +0 -0
  12. {bec_server-2.9.4 → bec_server-2.9.6}/README.md +0 -0
  13. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/__init__.py +0 -0
  14. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/bec_server_utils/__init__.py +0 -0
  15. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/bec_server_utils/launch.py +0 -0
  16. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/bec_server_utils/service_handler.py +0 -0
  17. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/bec_server_utils/subprocess_launch.py +0 -0
  18. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/bec_server_utils/tmux_launch.py +0 -0
  19. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/data_processing/__init__.py +0 -0
  20. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/data_processing/cli/__init__.py +0 -0
  21. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/data_processing/cli/launch.py +0 -0
  22. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/data_processing/dap_server.py +0 -0
  23. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/data_processing/dap_service.py +0 -0
  24. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/data_processing/dap_service_manager.py +0 -0
  25. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/data_processing/lmfit1d_service.py +0 -0
  26. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/__init__.py +0 -0
  27. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/cli/__init__.py +0 -0
  28. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/cli/launch.py +0 -0
  29. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/device_server.py +0 -0
  30. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/devices/__init__.py +0 -0
  31. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/devices/config_update_handler.py +0 -0
  32. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/devices/device_serializer.py +0 -0
  33. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/devices/devicemanager.py +0 -0
  34. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/rpc_mixin.py +0 -0
  35. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/tests/__init__.py +0 -0
  36. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/device_server/tests/utils.py +0 -0
  37. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/file_writer/__init__.py +0 -0
  38. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/file_writer/cli/__init__.py +0 -0
  39. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/file_writer/cli/launch.py +0 -0
  40. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/file_writer/default_writer.py +0 -0
  41. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/file_writer/file_writer.py +0 -0
  42. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/file_writer/file_writer_manager.py +0 -0
  43. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/file_writer/merged_dicts.py +0 -0
  44. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/file_writer_plugins/__init__.py +0 -0
  45. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/file_writer_plugins/cSAXS.py +0 -0
  46. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_bundler/__init__.py +0 -0
  47. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_bundler/bec_emitter.py +0 -0
  48. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_bundler/bluesky_emitter.py +0 -0
  49. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_bundler/cli/__init__.py +0 -0
  50. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_bundler/cli/launch.py +0 -0
  51. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_bundler/emitter.py +0 -0
  52. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_bundler/scan_bundler.py +0 -0
  53. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/__init__.py +0 -0
  54. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/cli/__init__.py +0 -0
  55. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/cli/launch.py +0 -0
  56. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/device_validation.py +0 -0
  57. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/errors.py +0 -0
  58. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/path_optimization.py +0 -0
  59. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scan_assembler.py +0 -0
  60. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scan_guard.py +0 -0
  61. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scan_manager.py +0 -0
  62. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scan_plugins/__init__.py +0 -0
  63. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scan_plugins/otf_scan.py +0 -0
  64. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scan_server.py +0 -0
  65. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scan_stubs.py +0 -0
  66. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scan_worker.py +0 -0
  67. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/scans.py +0 -0
  68. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/tests/__init__.py +0 -0
  69. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/tests/fixtures.py +0 -0
  70. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scan_server/tests/utils.py +0 -0
  71. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/__init__.py +0 -0
  72. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/cli/__init__.py +0 -0
  73. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/cli/launch.py +0 -0
  74. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/repeated_timer.py +0 -0
  75. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/scibec/__init__.py +0 -0
  76. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/scibec/config_handler.py +0 -0
  77. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/scihub.py +0 -0
  78. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/scilog/__init__.py +0 -0
  79. {bec_server-2.9.4 → bec_server-2.9.6}/bec_server/scihub/scilog/scilog.py +0 -0
  80. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_bec_server_utils/test_main.py +0 -0
  81. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_bec_server_utils/test_service_handler.py +0 -0
  82. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_bec_server_utils/test_tmux_launch.py +0 -0
  83. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_data_processing/conftest.py +0 -0
  84. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_data_processing/test_dap_cli_launch.py +0 -0
  85. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_data_processing/test_dap_server.py +0 -0
  86. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_data_processing/test_dap_service_manager.py +0 -0
  87. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_data_processing/test_lmfit1d_service.py +0 -0
  88. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_device_server/conftest.py +0 -0
  89. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_device_server/test_config_handler.py +0 -0
  90. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_device_server/test_device_manager_ds.py +0 -0
  91. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_device_server/test_device_serializer.py +0 -0
  92. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_device_server/test_device_server.py +0 -0
  93. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_device_server/test_device_server_cli_launch.py +0 -0
  94. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_device_server/test_rpc_mixin.py +0 -0
  95. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_file_writer/conftest.py +0 -0
  96. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_file_writer/test_file_writer.py +0 -0
  97. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_file_writer/test_file_writer_cli_launch.py +0 -0
  98. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_file_writer/test_file_writer_manager.py +0 -0
  99. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_bundler/conftest.py +0 -0
  100. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_bundler/test_bec_emitter.py +0 -0
  101. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_bundler/test_bluesky_emitter.py +0 -0
  102. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_bundler/test_emitter.py +0 -0
  103. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_bundler/test_scan_bundler.py +0 -0
  104. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_bundler/test_scan_bundler_cli_launch.py +0 -0
  105. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_server/conftest.py +0 -0
  106. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_server/test_path_optimization.py +0 -0
  107. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_server/test_scan_guard.py +0 -0
  108. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_server/test_scan_server_cli_launch.py +0 -0
  109. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_server/test_scan_stubs.py +0 -0
  110. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_server/test_scan_worker.py +0 -0
  111. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scan_server/test_scans.py +0 -0
  112. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scihub/test_repeated_timer.py +0 -0
  113. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scihub/test_scibec_config_handler.py +0 -0
  114. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scihub/test_scihub_cli_launch.py +0 -0
  115. {bec_server-2.9.4 → bec_server-2.9.6}/tests/tests_scihub/test_scilog_connector.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: bec-server
3
- Version: 2.9.4
3
+ Version: 2.9.6
4
4
  Summary: BEC server
5
5
  Project-URL: Bug Tracker, https://gitlab.psi.ch/bec/bec/issues
6
6
  Project-URL: Homepage, https://gitlab.psi.ch/bec/bec
@@ -224,8 +224,8 @@ class QueueManager:
224
224
  return None
225
225
  return self.queues[queue].queue[0].active_request_block.scan_id
226
226
 
227
- def _wait_for_queue_to_appear_in_history(self, scan_id, queue):
228
- timeout_time = 10
227
+ def _wait_for_queue_to_appear_in_history(self, scan_id, queue, timeout=10):
228
+ timeout_time = timeout
229
229
  elapsed_time = 0
230
230
  while True:
231
231
  if elapsed_time > timeout_time:
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  import os
4
4
  from typing import TYPE_CHECKING
5
5
 
6
+ import py_scibec
6
7
  from dotenv import dotenv_values
7
8
  from py_scibec import SciBecCore
8
9
 
@@ -176,29 +177,24 @@ class SciBecConnector:
176
177
  self.scibec.login(username=self.ingestor, password=self.ingestor_secret)
177
178
 
178
179
  def _update_experiment_info(self):
179
- beamline_info = self.scibec.beamline.beamline_controller_find(
180
- query_params={"filter": {"where": {"name": self.target_bl}}}
181
- )
182
- if not beamline_info.body:
180
+ bl_filter = py_scibec.bec.BeamlineFilterWhere(where={"name": self.target_bl})
181
+ beamline_info = self.scibec.beamline.beamline_controller_find(bl_filter)
182
+ if not beamline_info:
183
183
  raise SciBecConnectorError(f"Could not find a beamline with the name {self.target_bl}")
184
- beamline_info = beamline_info.body[0]
185
- self.scibec_info["beamline"] = beamline_info
186
- experiment_id = beamline_info.get("activeExperiment")
184
+ self.scibec_info["beamline"] = beamline_info[0]
185
+ experiment_id = beamline_info[0].active_experiment
187
186
 
188
187
  if not experiment_id:
189
188
  raise SciBecConnectorError(f"Could not find an active experiment on {self.target_bl}")
190
189
 
191
- experiment = self.scibec.experiment.experiment_controller_find_by_id(
192
- path_params={"id": experiment_id}
193
- )
190
+ experiment = self.scibec.experiment.experiment_controller_find_by_id(experiment_id)
194
191
 
195
192
  if not experiment:
196
193
  raise SciBecConnectorError(f"Could not find an experiment with the id {experiment_id}")
197
- experiment = experiment.body
198
194
  self.scibec_info["activeExperiment"] = experiment
199
195
 
200
196
  def _update_eaccount_in_redis(self):
201
- write_account = self.scibec_info["activeExperiment"]["writeAccount"]
197
+ write_account = self.scibec_info["activeExperiment"].write_account
202
198
  if write_account[0] == "p":
203
199
  write_account = write_account.replace("p", "e")
204
200
  msg = messages.VariableMessage(value=write_account)
@@ -5,6 +5,8 @@ import time
5
5
  from typing import TYPE_CHECKING, Any
6
6
 
7
7
  import numpy as np
8
+ import py_scibec
9
+ import py_scibec_openapi_client.models as py_scibec_models
8
10
 
9
11
  from bec_lib import MessageEndpoints, bec_logger
10
12
  from bec_lib.serialization import json_ext
@@ -67,59 +69,60 @@ class SciBecMetadataHandler:
67
69
  if not scibec:
68
70
  return
69
71
  scibec_info = self.scibec_connector.scibec_info
70
- experiment_id = scibec_info["activeExperiment"]["id"]
72
+ experiment_id = scibec_info["activeExperiment"].id
71
73
  # session_id = scibec_info["activeSession"][0]["id"]
72
74
  # experiment_id = scibec_info["activeSession"][0]["experimentId"]
73
75
  logger.debug(f"Received new scan status {msg}")
74
- scan = scibec.scan.scan_controller_find(
75
- query_params={"filter": {"where": {"scanId": msg.content["scan_id"]}}}
76
- ).body
76
+ scan_filter = py_scibec.bec.ScanFilterWhere(where={"scanId": msg.content["scan_id"]})
77
+ scan = scibec.scan.scan_controller_find(scan_filter)
77
78
  if not scan:
78
79
  info = msg.content["info"]
79
80
  dataset_number = info.get("dataset_number")
80
- dataset = scibec.dataset.dataset_controller_find(
81
- query_params={
82
- "filter": {"where": {"number": dataset_number, "experimentId": experiment_id}}
83
- }
84
- ).body
81
+ dataset_filter = py_scibec.bec.DatasetFilterWhere(
82
+ where={"number": dataset_number, "experimentId": experiment_id}
83
+ )
84
+ dataset = scibec.dataset.dataset_controller_find(dataset_filter)
85
85
  if dataset:
86
86
  dataset = dataset[0]
87
87
  else:
88
- dataset = scibec.dataset.dataset_controller_create(
89
- body=scibec.models.Dataset(
90
- **{
91
- "readACL": scibec_info["activeExperiment"]["readACL"],
92
- "writeACL": scibec_info["activeExperiment"]["readACL"],
93
- "owner": scibec_info["activeExperiment"]["owner"],
94
- "number": dataset_number,
95
- "experimentId": experiment_id,
96
- "name": info.get("dataset_name", ""),
97
- }
98
- )
99
- ).body
88
+ new_dataset = py_scibec.bec.NewDataset(
89
+ **{
90
+ "readACL": scibec_info["activeExperiment"].read_acl,
91
+ "writeACL": scibec_info["activeExperiment"].read_acl,
92
+ "owner": scibec_info["activeExperiment"].owner,
93
+ "number": dataset_number,
94
+ "experimentId": experiment_id,
95
+ "name": info.get("dataset_name", ""),
96
+ }
97
+ )
98
+ dataset = scibec.dataset.dataset_controller_create(new_dataset)
100
99
 
101
- scan_data = {
102
- "readACL": scibec_info["activeExperiment"]["readACL"],
103
- "writeACL": scibec_info["activeExperiment"]["readACL"],
104
- "owner": scibec_info["activeExperiment"]["owner"],
105
- "scanType": info.get("scan_name", ""),
106
- "scanId": info.get("scan_id", ""),
107
- "queueId": info.get("queue_id", ""),
108
- "requestId": info.get("RID", ""),
109
- "exitStatus": msg.content["status"],
110
- # "queue": info.get("stream", ""),
111
- "metadata": info,
112
- # "sessionId": session_id,
113
- "datasetId": dataset["id"],
114
- "scanNumber": info.get("scan_number", 0),
115
- }
116
- scan = scibec.scan.scan_controller_create(body=scibec.models.Scan(**scan_data)).body
100
+ new_scan = py_scibec.bec.NewScan(
101
+ **{
102
+ "readACL": scibec_info["activeExperiment"].read_acl,
103
+ "writeACL": scibec_info["activeExperiment"].read_acl,
104
+ "owner": scibec_info["activeExperiment"].owner,
105
+ "scanType": info.get("scan_name", ""),
106
+ "scanId": info.get("scan_id", ""),
107
+ "queueId": info.get("queue_id", ""),
108
+ "requestId": info.get("RID", ""),
109
+ "exitStatus": msg.content["status"],
110
+ # "queue": info.get("stream", ""),
111
+ "metadata": info,
112
+ # "sessionId": session_id,
113
+ "datasetId": dataset.id,
114
+ "scanNumber": info.get("scan_number", 0),
115
+ }
116
+ )
117
+ scan = scibec.scan.scan_controller_create(new_scan)
117
118
  # scan = scibec.add_scan(scan_data)
118
119
  else:
119
120
  info = msg.content["info"]
120
121
  scan = scibec.scan.scan_controller_update_by_id(
121
- path_params={"id": scan[0]["id"]},
122
- body={"metadata": info, "exitStatus": msg.content["status"]},
122
+ id=scan[0].id,
123
+ scan_partial=py_scibec.bec.ScanPartial(
124
+ metadata=info, exitStatus=msg.content["status"]
125
+ ),
123
126
  )
124
127
  return scan
125
128
 
@@ -174,9 +177,8 @@ class SciBecMetadataHandler:
174
177
  scibec = self.scibec_connector.scibec
175
178
  if not scibec:
176
179
  return
177
- scan = scibec.scan.scan_controller_find(
178
- query_params={"filter": {"where": {"scanId": data["metadata"]["scan_id"]}}}
179
- ).body
180
+ scan_filter = py_scibec.bec.ScanFilterWhere(where={"scanId": data["metadata"]["scan_id"]})
181
+ scan = scibec.scan.scan_controller_find(scan_filter)
180
182
  if not scan:
181
183
  logger.warning(
182
184
  f"Could not find scan with scan_id {data['metadata']['scan_id']}. Cannot write scan"
@@ -195,24 +197,24 @@ class SciBecMetadataHandler:
195
197
  )
196
198
  self._write_scan_data_chunks(file_path, data_bec, scan)
197
199
  else:
198
-
199
- scibec.scan_data.scan_data_controller_create_many(
200
- body=scibec.models.ScanData(
201
- **{
202
- "readACL": scan["readACL"],
203
- "writeACL": scan["readACL"],
204
- "owner": scan["owner"],
205
- "scanId": scan["id"],
206
- "filePath": file_path,
207
- "data": data_bec,
208
- }
209
- )
200
+ new_scan_data = py_scibec.bec.NewScanData(
201
+ **{
202
+ "readACL": scan.read_acl,
203
+ "writeACL": scan.read_acl,
204
+ "owner": scan.owner,
205
+ "scanId": scan.id,
206
+ "filePath": file_path,
207
+ "data": data_bec,
208
+ }
210
209
  )
210
+ scibec.scan_data.scan_data_controller_create_many(new_scan_data)
211
211
  logger.info(
212
212
  f"Wrote scan data to SciBec for scan_id {data['metadata']['scan_id']} in {time.time() - start} seconds."
213
213
  )
214
214
 
215
- def _write_scan_data_chunks(self, file_path: str, data_bec: dict, scan: dict):
215
+ def _write_scan_data_chunks(
216
+ self, file_path: str, data_bec: dict, scan: py_scibec_models.ScanWithRelations
217
+ ):
216
218
  """
217
219
  Write the scan data to SciBec in chunks. This method is called if the scan data is larger
218
220
  than 1 MB. The method loops through all keys in the data dictionary and creates chunks of
@@ -234,35 +236,33 @@ class SciBecMetadataHandler:
234
236
  )
235
237
  continue
236
238
  if len(json.dumps(chunk)) + len(json.dumps({key: value})) > self.MAX_DATA_SIZE:
237
- scibec.scan_data.scan_data_controller_create_many(
238
- body=scibec.models.ScanData(
239
- **{
240
- "readACL": scan["readACL"],
241
- "writeACL": scan["readACL"],
242
- "owner": scan["owner"],
243
- "scanId": scan["id"],
244
- "filePath": file_path,
245
- "data": chunk,
246
- }
247
- )
239
+ new_scan_data = py_scibec.bec.NewScanData(
240
+ **{
241
+ "readACL": scan.read_acl,
242
+ "writeACL": scan.read_acl,
243
+ "owner": scan.owner,
244
+ "scanId": scan.id,
245
+ "filePath": file_path,
246
+ "data": chunk,
247
+ }
248
248
  )
249
+ scibec.scan_data.scan_data_controller_create_many(new_scan_data)
249
250
  chunk = {}
250
251
  chunk[key] = value
251
252
 
252
253
  # Write the last chunk
253
254
  if chunk:
254
- scibec.scan_data.scan_data_controller_create_many(
255
- body=scibec.models.ScanData(
256
- **{
257
- "readACL": scan["readACL"],
258
- "writeACL": scan["readACL"],
259
- "owner": scan["owner"],
260
- "scanId": scan["id"],
261
- "filePath": file_path,
262
- "data": chunk,
263
- }
264
- )
255
+ new_scan_data = py_scibec.bec.NewScanData(
256
+ **{
257
+ "readACL": scan.read_acl,
258
+ "writeACL": scan.read_acl,
259
+ "owner": scan.owner,
260
+ "scanId": scan.id,
261
+ "filePath": file_path,
262
+ "data": chunk,
263
+ }
265
264
  )
265
+ scibec.scan_data.scan_data_controller_create_many(new_scan_data)
266
266
 
267
267
  def shutdown(self):
268
268
  """
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "bec-server"
7
- version = "2.9.4"
7
+ version = "2.9.6"
8
8
  description = "BEC server"
9
9
  requires-python = ">=3.10"
10
10
  classifiers = [
@@ -397,6 +397,25 @@ def test_scan_queue_next_instruction_queue_does_not_pop(queuemanager_mock):
397
397
  assert len(queue.queue) == 1
398
398
 
399
399
 
400
+ def test_queue_manager_wait_for_queue_to_appear_in_history_raises_timeout(queuemanager_mock):
401
+ queue_manager = queuemanager_mock()
402
+ with pytest.raises(TimeoutError):
403
+ queue_manager._wait_for_queue_to_appear_in_history("scan_id", "primary", timeout=0.5)
404
+
405
+
406
+ def test_queue_manager_wait_for_queue_to_appear_in_history(queuemanager_mock):
407
+ queue_manager = queuemanager_mock()
408
+ scan_queue = ScanQueue(queue_manager, InstructionQueueMock)
409
+ instruction_queue = InstructionQueueItem(scan_queue, mock.MagicMock(), mock.MagicMock())
410
+ request_queue = RequestBlockQueue(instruction_queue, mock.MagicMock())
411
+ request_block = RequestBlock(mock.MagicMock(), mock.MagicMock(), request_queue)
412
+ request_block.scan_id = "scan_id"
413
+ request_queue.request_blocks.append(request_block)
414
+ instruction_queue.queue = request_queue
415
+ queue_manager.queues["primary"].history_queue.append(instruction_queue)
416
+ queue_manager._wait_for_queue_to_appear_in_history("scan_id", "primary", timeout=0.5)
417
+
418
+
400
419
  class RequestBlockMock(RequestBlock):
401
420
  def __init__(self, msg, scan_id) -> None:
402
421
  self.scan_id = scan_id
@@ -0,0 +1,49 @@
1
+ import pytest
2
+ from py_scibec_openapi_client.models.beamline_with_relations import BeamlineWithRelations
3
+ from py_scibec_openapi_client.models.dataset_with_relations import DatasetWithRelations
4
+ from py_scibec_openapi_client.models.experiment_with_relations import ExperimentWithRelations
5
+ from py_scibec_openapi_client.models.scan_with_relations import ScanWithRelations
6
+
7
+ from bec_lib import bec_logger
8
+
9
+ # overwrite threads_check fixture from bec_lib,
10
+ # to have it in autouse
11
+
12
+
13
+ @pytest.fixture(autouse=True)
14
+ def threads_check(threads_check):
15
+ yield
16
+ bec_logger.logger.remove()
17
+
18
+
19
+ @pytest.fixture()
20
+ def active_experiment():
21
+ return ExperimentWithRelations(
22
+ name="dummy_experiment",
23
+ writeAccount="p12345",
24
+ id="dummy_experiment_id",
25
+ beamlineId="dummy_id",
26
+ )
27
+
28
+
29
+ @pytest.fixture()
30
+ def beamline_document():
31
+ return BeamlineWithRelations(
32
+ name="dummy_bl", activeExperiment="dummy_experiment", id="dummy_id"
33
+ )
34
+
35
+
36
+ @pytest.fixture()
37
+ def dataset_document():
38
+ return DatasetWithRelations(name="dummy_dataset", id="dummy_id")
39
+
40
+
41
+ @pytest.fixture()
42
+ def scan_document():
43
+ return ScanWithRelations(
44
+ name="dummy_scan",
45
+ id="dummy_id",
46
+ readACL=["readACL"],
47
+ writeACL=["writeACL"],
48
+ owner=["owner"],
49
+ )
@@ -3,7 +3,6 @@ from unittest import mock
3
3
  import pytest
4
4
 
5
5
  from bec_lib import MessageEndpoints, ServiceConfig, messages
6
- from bec_lib.logger import bec_logger
7
6
  from bec_lib.messages import BECStatus
8
7
  from bec_lib.tests.utils import ConnectorMock
9
8
  from bec_server.scihub import SciHub
@@ -114,36 +113,18 @@ def test_scibec_connect_to_scibec(SciBecMock):
114
113
  mock_update_eaccount_in_redis.assert_called_once()
115
114
 
116
115
 
117
- class ServerResponseMock:
118
- def __init__(self, body):
119
- self.body = body
120
-
121
-
122
- def test_scibec_update_experiment_info(SciBecMock):
116
+ def test_scibec_update_experiment_info(SciBecMock, active_experiment, beamline_document):
123
117
  with mock.patch.object(SciBecMock, "scibec") as mock_scibec:
124
- beamline_document = {
125
- "name": "dummy_bl",
126
- "activeExperiment": "dummy_experiment",
127
- "id": "dummy_id",
128
- }
129
- mock_scibec.beamline.beamline_controller_find.return_value = ServerResponseMock(
130
- (beamline_document,)
131
- )
132
- experiment_document = {
133
- "name": "dummy_experiment",
134
- "writeAccount": "dummy_write_account",
135
- "id": "dummy_experiment_id",
136
- }
137
- mock_scibec.experiment.experiment_controller_find_by_id.return_value = ServerResponseMock(
138
- experiment_document
139
- )
118
+ mock_scibec.beamline.beamline_controller_find.return_value = (beamline_document,)
119
+ experiment_document = active_experiment
120
+ mock_scibec.experiment.experiment_controller_find_by_id.return_value = experiment_document
140
121
  SciBecMock._update_experiment_info()
141
122
  assert SciBecMock.scibec_info["activeExperiment"] == experiment_document
142
123
  assert SciBecMock.scibec_info["beamline"] == beamline_document
143
124
 
144
125
 
145
- def test_update_eaccount_in_redis(SciBecMock):
146
- SciBecMock.scibec_info = {"activeExperiment": {"writeAccount": "p12345"}}
126
+ def test_update_eaccount_in_redis(SciBecMock, active_experiment):
127
+ SciBecMock.scibec_info = {"activeExperiment": active_experiment}
147
128
  with mock.patch.object(SciBecMock, "connector") as mock_connector:
148
129
  SciBecMock._update_eaccount_in_redis()
149
130
  mock_connector.set.assert_called_once_with(
@@ -2,6 +2,7 @@ from unittest import mock
2
2
 
3
3
  import numpy as np
4
4
  import pytest
5
+ from py_scibec_openapi_client.models import NewScanData, ScanPartial
5
6
 
6
7
  from bec_lib import messages
7
8
  from bec_lib.redis_connector import MessageObject
@@ -46,48 +47,33 @@ def test_update_scan_status_returns_without_scibec(md_handler):
46
47
  md_handler.update_scan_status(msg)
47
48
 
48
49
 
49
- def test_update_scan_status(md_handler):
50
+ def test_update_scan_status(md_handler, active_experiment, dataset_document):
50
51
  # pylint: disable=protected-access
51
52
  msg = messages.ScanStatusMessage(scan_id="scan_id", status="open", info={"dataset_number": 12})
52
53
  scibec = mock.Mock()
53
54
  md_handler.scibec_connector.scibec = scibec
54
- scibec_info = {
55
- "activeExperiment": {
56
- "id": "id",
57
- "readACL": ["readACL"],
58
- "writeACL": ["writeACL"],
59
- "owner": "owner",
60
- }
61
- }
55
+ scibec_info = {"activeExperiment": active_experiment}
62
56
  md_handler.scibec_connector.scibec_info = scibec_info
63
- type(scibec.scan.scan_controller_find()).body = mock.PropertyMock(return_value=[])
64
- type(scibec.dataset.dataset_controller_find()).body = mock.PropertyMock(return_value=[])
65
- type(scibec.dataset.dataset_controller_create()).body = mock.PropertyMock(
66
- return_value={"id": "id"}
67
- )
57
+ scibec.scan.scan_controller_find = mock.MagicMock(return_value=[])
58
+ scibec.dataset.dataset_controller_find = mock.MagicMock(return_value=[])
59
+ scibec.dataset.dataset_controller_create = mock.MagicMock(return_value=dataset_document)
68
60
  md_handler.update_scan_status(msg)
69
61
 
70
62
 
71
- def test_update_scan_status_patch(md_handler):
63
+ def test_update_scan_status_patch(md_handler, active_experiment, scan_document):
72
64
  # pylint: disable=protected-access
73
65
  msg = messages.ScanStatusMessage(
74
66
  scan_id="scan_id", status="closed", info={"dataset_number": 12}
75
67
  )
76
68
  scibec = mock.Mock()
77
69
  md_handler.scibec_connector.scibec = scibec
78
- scibec_info = {
79
- "activeExperiment": {
80
- "id": "id",
81
- "readACL": ["readACL"],
82
- "writeACL": ["writeACL"],
83
- "owner": "owner",
84
- }
85
- }
70
+ scibec_info = {"activeExperiment": active_experiment}
86
71
  md_handler.scibec_connector.scibec_info = scibec_info
87
- type(scibec.scan.scan_controller_find()).body = mock.PropertyMock(return_value=[{"id": "id"}])
72
+ scibec.scan.scan_controller_find = mock.MagicMock(return_value=[scan_document])
88
73
  md_handler.update_scan_status(msg)
89
74
  scibec.scan.scan_controller_update_by_id.assert_called_once_with(
90
- path_params={"id": "id"}, body={"metadata": {"dataset_number": 12}, "exitStatus": "closed"}
75
+ id="dummy_id",
76
+ scan_partial=ScanPartial(exit_status="closed", metadata={"dataset_number": 12}),
91
77
  )
92
78
 
93
79
 
@@ -124,31 +110,27 @@ def test_update_scan_data_without_scan(md_handler):
124
110
  # pylint: disable=protected-access
125
111
  scibec = mock.Mock()
126
112
  md_handler.scibec_connector.scibec = scibec
127
- type(scibec.scan.scan_controller_find()).body = mock.PropertyMock(return_value=[])
113
+ scibec.scan.scan_controller_find = mock.MagicMock(return_value=[])
128
114
  md_handler.update_scan_data(
129
115
  file_path="my_file.h5", data={"data": {}, "metadata": {"scan_id": "scan_id"}}
130
116
  )
131
117
 
132
118
 
133
- def test_update_scan_data(md_handler):
119
+ def test_update_scan_data(md_handler, scan_document):
134
120
  # pylint: disable=protected-access
135
121
  scibec = mock.Mock()
136
122
  md_handler.scibec_connector.scibec = scibec
137
- type(scibec.scan.scan_controller_find()).body = mock.PropertyMock(
138
- return_value=[
139
- {"id": "id", "readACL": ["readACL"], "writeACL": ["writeACL"], "owner": "owner"}
140
- ]
141
- )
123
+ scibec.scan.scan_controller_find = mock.MagicMock(return_value=[scan_document])
142
124
  md_handler.update_scan_data(
143
125
  file_path="my_file.h5", data={"data": {}, "metadata": {"scan_id": "scan_id"}}
144
126
  )
145
127
  scibec.scan_data.scan_data_controller_create_many.assert_called_once_with(
146
- body=scibec.models.ScanData(
128
+ NewScanData(
147
129
  **{
148
- "readACL": "readACL",
149
- "writeACL": "readACL",
150
- "owner": "owner",
151
- "scanId": "id",
130
+ "readACL": ["readACL"],
131
+ "writeACL": ["readACL"],
132
+ "owner": ["owner"],
133
+ "scanId": "dummy_id",
152
134
  "filePath": "my_file.h5",
153
135
  "data": {"data": {}, "metadata": {"scan_id": "scan_id"}},
154
136
  }
@@ -156,16 +138,12 @@ def test_update_scan_data(md_handler):
156
138
  )
157
139
 
158
140
 
159
- def test_update_scan_data_exceeding_limit(md_handler):
141
+ def test_update_scan_data_exceeding_limit(md_handler, scan_document):
160
142
  # pylint: disable=protected-access
161
143
  scibec = mock.Mock()
162
144
  md_handler.MAX_DATA_SIZE = 1000
163
145
  md_handler.scibec_connector.scibec = scibec
164
- type(scibec.scan.scan_controller_find()).body = mock.PropertyMock(
165
- return_value=[
166
- {"id": "id", "readACL": ["readACL"], "writeACL": ["writeACL"], "owner": "owner"}
167
- ]
168
- )
146
+ scibec.scan.scan_controller_find = mock.MagicMock(return_value=[scan_document])
169
147
  data_block = {f"key_{i}": {"signal": list(range(100))} for i in range(10)}
170
148
  data_block.update({"metadata": {"scan_id": "scan_id"}})
171
149
  md_handler.update_scan_data(file_path="my_file.h5", data=data_block)
@@ -1,12 +0,0 @@
1
- import pytest
2
-
3
- from bec_lib import bec_logger
4
-
5
- # overwrite threads_check fixture from bec_lib,
6
- # to have it in autouse
7
-
8
-
9
- @pytest.fixture(autouse=True)
10
- def threads_check(threads_check):
11
- yield
12
- bec_logger.logger.remove()
File without changes
File without changes