bec-lib 4.4.1__tar.gz → 4.4.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 (166) hide show
  1. {bec_lib-4.4.1 → bec_lib-4.4.2}/PKG-INFO +1 -1
  2. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/redis_connector/managed_redis_connection.py +5 -5
  3. {bec_lib-4.4.1 → bec_lib-4.4.2}/pyproject.toml +1 -1
  4. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_redis_connector_fakeredis.py +30 -0
  5. {bec_lib-4.4.1 → bec_lib-4.4.2}/.gitignore +0 -0
  6. {bec_lib-4.4.1 → bec_lib-4.4.2}/README.md +0 -0
  7. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/__init__.py +0 -0
  8. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/_print_versions.py +0 -0
  9. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/acl_login.py +0 -0
  10. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/actors.py +0 -0
  11. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/alarm_handler.py +0 -0
  12. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/atlas_models.py +0 -0
  13. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/bec_errors.py +0 -0
  14. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/bec_service.py +0 -0
  15. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/bec_yaml_loader.py +0 -0
  16. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/bl_state_manager.py +0 -0
  17. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/bl_states.py +0 -0
  18. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/builtin_actor_hli.py +0 -0
  19. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/callback_handler.py +0 -0
  20. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/channel_monitor.py +0 -0
  21. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/client.py +0 -0
  22. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/codecs.py +0 -0
  23. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/config_helper.py +0 -0
  24. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/config_values.py +0 -0
  25. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/configs/__init__.py +0 -0
  26. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/configs/demo_config.yaml +0 -0
  27. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/configs/openapi_schema.json +0 -0
  28. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/connector.py +0 -0
  29. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/dap_plugin_objects.py +0 -0
  30. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/dap_plugins.py +0 -0
  31. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/device.py +0 -0
  32. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/devicemanager.py +0 -0
  33. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/endpoints.py +0 -0
  34. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/file_utils.py +0 -0
  35. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/live_scan_data.py +0 -0
  36. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/lmfit_serializer.py +0 -0
  37. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/logger.py +0 -0
  38. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/macro_update_handler.py +0 -0
  39. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/messages.py +0 -0
  40. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/messaging_hooks.py +0 -0
  41. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/messaging_services.py +0 -0
  42. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/metadata_schema.py +0 -0
  43. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/numpy_encoder.py +0 -0
  44. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/observer.py +0 -0
  45. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/path_optimization.py +0 -0
  46. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/pdf_writer.py +0 -0
  47. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/plugin_helper.py +0 -0
  48. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/position_generators.py +0 -0
  49. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/procedures/__init__.py +0 -0
  50. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/procedures/helper.py +0 -0
  51. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/procedures/hli.py +0 -0
  52. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/procedures/status.py +0 -0
  53. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/queue_items.py +0 -0
  54. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/redis_connector/__init__.py +0 -0
  55. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/redis_connector/constants.py +0 -0
  56. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/redis_connector/hli.py +0 -0
  57. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/redis_connector/streams.py +0 -0
  58. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/redis_connector/validation.py +0 -0
  59. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/request_context.py +0 -0
  60. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/request_items.py +0 -0
  61. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/scan_args.py +0 -0
  62. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/scan_data_container.py +0 -0
  63. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/scan_history.py +0 -0
  64. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/scan_input_validator.py +0 -0
  65. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/scan_items.py +0 -0
  66. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/scan_manager.py +0 -0
  67. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/scan_number_container.py +0 -0
  68. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/scan_preview.py +0 -0
  69. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/scan_repeat.py +0 -0
  70. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/scan_report.py +0 -0
  71. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/scans.py +0 -0
  72. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/scibec_validator.py +0 -0
  73. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/script_executor.py +0 -0
  74. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/serialization.py +0 -0
  75. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/serialization_registry.py +0 -0
  76. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/service_config.py +0 -0
  77. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/signature_serializer.py +0 -0
  78. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/tests/__init__.py +0 -0
  79. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/tests/fixtures.py +0 -0
  80. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/tests/test_config.yaml +0 -0
  81. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/tests/test_service_config.yaml +0 -0
  82. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/tests/utils.py +0 -0
  83. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/user_macros.py +0 -0
  84. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/__init__.py +0 -0
  85. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/copier_jinja_filters.py +0 -0
  86. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/deprecation.py +0 -0
  87. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/import_utils.py +0 -0
  88. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/json_extended.py +0 -0
  89. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/plugin_manager/__init__.py +0 -0
  90. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/plugin_manager/_constants.py +0 -0
  91. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/plugin_manager/_util.py +0 -0
  92. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/plugin_manager/create/__init__.py +0 -0
  93. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/plugin_manager/create/device.py +0 -0
  94. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/plugin_manager/create/scan.py +0 -0
  95. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/plugin_manager/create/templates/scan.py.jinja +0 -0
  96. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/plugin_manager/main.py +0 -0
  97. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/proxy.py +0 -0
  98. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/pydantic_pretty_print.py +0 -0
  99. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/rpc_utils.py +0 -0
  100. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/scan_utils.py +0 -0
  101. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/threading_utils.py +0 -0
  102. {bec_lib-4.4.1 → bec_lib-4.4.2}/bec_lib/utils/user_acls_test.py +0 -0
  103. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/__init__.py +0 -0
  104. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/_additional_for_signature_serializer_test.py +0 -0
  105. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/conftest.py +0 -0
  106. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_acl_login.py +0 -0
  107. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_alarm_handler.py +0 -0
  108. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_atlas_models.py +0 -0
  109. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_beamline_states.py +0 -0
  110. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_bec_logger.py +0 -0
  111. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_bec_messages.py +0 -0
  112. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_bec_service.py +0 -0
  113. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_callback_handler.py +0 -0
  114. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_channel_monitor.py +0 -0
  115. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_client.py +0 -0
  116. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_config_helper.py +0 -0
  117. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_core_utils.py +0 -0
  118. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_dap_plugins.py +0 -0
  119. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_data_container.py +0 -0
  120. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_deprecation.py +0 -0
  121. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_device_hashing.py +0 -0
  122. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_device_manager.py +0 -0
  123. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_devices.py +0 -0
  124. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_file_utils.py +0 -0
  125. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_hli_connector_fakeredis.py +0 -0
  126. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_hli_redis_connector.py +0 -0
  127. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_import_utils.py +0 -0
  128. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_jinja_plugins.py +0 -0
  129. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_lmfit_serializer.py +0 -0
  130. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_managed_config_values.py +0 -0
  131. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_managed_redis_connection.py +0 -0
  132. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_messaging_hooks.py +0 -0
  133. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_messaging_service.py +0 -0
  134. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_metadata_schema.py +0 -0
  135. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_observer.py +0 -0
  136. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_path_optimization.py +0 -0
  137. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_pdf_writer.py +0 -0
  138. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_plugin_helper.py +0 -0
  139. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_plugin_manager.py +0 -0
  140. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_plugin_system.py +0 -0
  141. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_position_generators.py +0 -0
  142. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_procedure_submission.py +0 -0
  143. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_pydantic_pretty_print.py +0 -0
  144. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_queue_items.py +0 -0
  145. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_roi_endpoints.py +0 -0
  146. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_roi_messages.py +0 -0
  147. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_scan_context.py +0 -0
  148. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_scan_data.py +0 -0
  149. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_scan_history.py +0 -0
  150. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_scan_items.py +0 -0
  151. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_scan_manager.py +0 -0
  152. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_scan_object.py +0 -0
  153. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_scan_preview.py +0 -0
  154. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_scan_repeat.py +0 -0
  155. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_scan_report.py +0 -0
  156. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_scibec_validator.py +0 -0
  157. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_script_executor.py +0 -0
  158. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_serializer.py +0 -0
  159. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_service_config.py +0 -0
  160. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_signature_serializer.py +0 -0
  161. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_signature_serializer_with_future_import.py +0 -0
  162. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_stream_subs.py +0 -0
  163. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_user_macros.py +0 -0
  164. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_utils.py +0 -0
  165. {bec_lib-4.4.1 → bec_lib-4.4.2}/tests/test_yaml_loader.py +0 -0
  166. {bec_lib-4.4.1 → bec_lib-4.4.2}/util_scripts/init_config.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: bec_lib
3
- Version: 4.4.1
3
+ Version: 4.4.2
4
4
  Summary: BEC library
5
5
  Project-URL: Bug Tracker, https://github.com/bec-project/bec/issues
6
6
  Project-URL: Homepage, https://github.com/bec-project/bec
@@ -510,10 +510,7 @@ class ManagedRedisConnection:
510
510
  [(t, self._redis_conn.xrange(t, "-", end)) for t, end in topics_ids.items()],
511
511
  None,
512
512
  )
513
- return (
514
- self._redis_conn.xread(topics_ids, block=200) or [],
515
- None,
516
- ) # type: ignore strs are fine key and id types
513
+ return (self._redis_conn.xread(topics_ids, block=200) or [], None) # type: ignore strs are fine key and id types
517
514
  except redis.exceptions.ConnectionError:
518
515
  return None, self.connection_error_str
519
516
  except redis.exceptions.NoPermissionError:
@@ -556,11 +553,14 @@ class ManagedRedisConnection:
556
553
  # Then read all the normal streams
557
554
  with self._stream_subs.lock:
558
555
  normal_topics = self._stream_subs.topic_ids()
559
- normal_subs = self._stream_subs.normal_subs
560
556
  normal_error = None
561
557
  if normal_topics:
562
558
  response, normal_error = self._try_read_streams(normal_topics)
563
559
  if normal_error is None:
560
+ # Take the subscribers after the blocking read so that sub changes during the
561
+ # read take immediate effect
562
+ with self._stream_subs.lock:
563
+ normal_subs = self._stream_subs.normal_subs
564
564
  updated_ids = self._handle_stream_msg_list(response, normal_subs)
565
565
  else:
566
566
  updated_ids = {}
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "bec_lib"
7
- version = "4.4.1"
7
+ version = "4.4.2"
8
8
  description = "BEC library"
9
9
  requires-python = ">=3.11"
10
10
  classifiers = [
@@ -427,6 +427,36 @@ def test_redis_connector_register_stream(connected_connector):
427
427
  assert connector._stream_subs.all_topics == []
428
428
 
429
429
 
430
+ @pytest.mark.timeout(5)
431
+ def test_redis_connector_stream_cb_swapped_during_blocking_read(connected_connector):
432
+ """Callbacks (un)registered while the listener is blocked in xread must (not) receive the
433
+ messages that read returns."""
434
+ connector = connected_connector
435
+ cb_mock1 = mock.Mock(spec=[])
436
+ cb_mock2 = mock.Mock(spec=[])
437
+ in_read = threading.Event()
438
+ proceed = threading.Event()
439
+ orig_read = connector._try_read_streams
440
+
441
+ def blocking_read(topics_ids, from_start=False):
442
+ if not from_start:
443
+ in_read.set()
444
+ proceed.wait(timeout=2)
445
+ return orig_read(topics_ids, from_start)
446
+
447
+ with mock.patch.object(connector, "_try_read_streams", blocking_read):
448
+ connector.register(TestStreamEndpoint, cb=cb_mock1, start_thread=False)
449
+ assert in_read.wait(timeout=2)
450
+ connector.unregister("test", cb=cb_mock1)
451
+ connector.register(TestStreamEndpoint, cb=cb_mock2, start_thread=False)
452
+ connector.xadd("test", {"data": 1})
453
+ proceed.set()
454
+ # raises TimeoutError if the message was dropped instead of delivered to cb_mock2
455
+ connector.poll_messages(timeout=2)
456
+ cb_mock1.assert_not_called()
457
+ cb_mock2.assert_called_once_with({"data": 1})
458
+
459
+
430
460
  @pytest.mark.timeout(10)
431
461
  def test_redis_connector_register_stream_identical(connected_connector):
432
462
  connector = connected_connector
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