bec-lib 4.0.2__tar.gz → 4.0.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.
Files changed (156) hide show
  1. {bec_lib-4.0.2 → bec_lib-4.0.3}/PKG-INFO +1 -1
  2. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/device.py +6 -6
  3. {bec_lib-4.0.2 → bec_lib-4.0.3}/pyproject.toml +1 -1
  4. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_devices.py +45 -0
  5. {bec_lib-4.0.2 → bec_lib-4.0.3}/.gitignore +0 -0
  6. {bec_lib-4.0.2 → bec_lib-4.0.3}/README.md +0 -0
  7. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/__init__.py +0 -0
  8. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/_print_versions.py +0 -0
  9. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/acl_login.py +0 -0
  10. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/actors.py +0 -0
  11. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/alarm_handler.py +0 -0
  12. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/atlas_models.py +0 -0
  13. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/bec_errors.py +0 -0
  14. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/bec_service.py +0 -0
  15. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/bec_yaml_loader.py +0 -0
  16. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/bl_state_manager.py +0 -0
  17. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/bl_states.py +0 -0
  18. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/builtin_actor_hli.py +0 -0
  19. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/callback_handler.py +0 -0
  20. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/channel_monitor.py +0 -0
  21. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/client.py +0 -0
  22. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/codecs.py +0 -0
  23. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/config_helper.py +0 -0
  24. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/config_values.py +0 -0
  25. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/configs/__init__.py +0 -0
  26. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/configs/demo_config.yaml +0 -0
  27. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/configs/openapi_schema.json +0 -0
  28. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/connector.py +0 -0
  29. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/dap_plugin_objects.py +0 -0
  30. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/dap_plugins.py +0 -0
  31. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/devicemanager.py +0 -0
  32. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/endpoints.py +0 -0
  33. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/file_utils.py +0 -0
  34. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/live_scan_data.py +0 -0
  35. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/lmfit_serializer.py +0 -0
  36. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/logger.py +0 -0
  37. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/macro_update_handler.py +0 -0
  38. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/messages.py +0 -0
  39. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/messaging_hooks.py +0 -0
  40. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/messaging_services.py +0 -0
  41. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/metadata_schema.py +0 -0
  42. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/numpy_encoder.py +0 -0
  43. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/observer.py +0 -0
  44. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/pdf_writer.py +0 -0
  45. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/plugin_helper.py +0 -0
  46. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/procedures/__init__.py +0 -0
  47. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/procedures/helper.py +0 -0
  48. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/procedures/hli.py +0 -0
  49. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/procedures/status.py +0 -0
  50. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/queue_items.py +0 -0
  51. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/redis_connector/__init__.py +0 -0
  52. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/redis_connector/constants.py +0 -0
  53. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/redis_connector/hli.py +0 -0
  54. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/redis_connector/managed_redis_connection.py +0 -0
  55. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/redis_connector/streams.py +0 -0
  56. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/redis_connector/validation.py +0 -0
  57. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/request_context.py +0 -0
  58. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/request_items.py +0 -0
  59. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/scan_args.py +0 -0
  60. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/scan_data_container.py +0 -0
  61. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/scan_history.py +0 -0
  62. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/scan_input_validator.py +0 -0
  63. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/scan_items.py +0 -0
  64. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/scan_manager.py +0 -0
  65. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/scan_number_container.py +0 -0
  66. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/scan_repeat.py +0 -0
  67. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/scan_report.py +0 -0
  68. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/scans.py +0 -0
  69. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/scibec_validator.py +0 -0
  70. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/script_executor.py +0 -0
  71. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/serialization.py +0 -0
  72. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/serialization_registry.py +0 -0
  73. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/service_config.py +0 -0
  74. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/signature_serializer.py +0 -0
  75. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/tests/__init__.py +0 -0
  76. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/tests/fixtures.py +0 -0
  77. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/tests/test_config.yaml +0 -0
  78. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/tests/test_service_config.yaml +0 -0
  79. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/tests/utils.py +0 -0
  80. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/user_macros.py +0 -0
  81. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/__init__.py +0 -0
  82. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/copier_jinja_filters.py +0 -0
  83. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/deprecation.py +0 -0
  84. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/import_utils.py +0 -0
  85. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/json_extended.py +0 -0
  86. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/plugin_manager/__init__.py +0 -0
  87. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/plugin_manager/_constants.py +0 -0
  88. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/plugin_manager/_util.py +0 -0
  89. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/plugin_manager/create/__init__.py +0 -0
  90. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/plugin_manager/create/device.py +0 -0
  91. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/plugin_manager/create/scan.py +0 -0
  92. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/plugin_manager/create/templates/scan.py.jinja +0 -0
  93. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/plugin_manager/main.py +0 -0
  94. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/proxy.py +0 -0
  95. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/pydantic_pretty_print.py +0 -0
  96. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/rpc_utils.py +0 -0
  97. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/scan_utils.py +0 -0
  98. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/threading_utils.py +0 -0
  99. {bec_lib-4.0.2 → bec_lib-4.0.3}/bec_lib/utils/user_acls_test.py +0 -0
  100. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/__init__.py +0 -0
  101. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/_additional_for_signature_serializer_test.py +0 -0
  102. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/conftest.py +0 -0
  103. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_acl_login.py +0 -0
  104. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_alarm_handler.py +0 -0
  105. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_atlas_models.py +0 -0
  106. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_beamline_states.py +0 -0
  107. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_bec_logger.py +0 -0
  108. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_bec_messages.py +0 -0
  109. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_bec_service.py +0 -0
  110. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_callback_handler.py +0 -0
  111. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_channel_monitor.py +0 -0
  112. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_client.py +0 -0
  113. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_config_helper.py +0 -0
  114. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_core_utils.py +0 -0
  115. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_dap_plugins.py +0 -0
  116. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_data_container.py +0 -0
  117. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_deprecation.py +0 -0
  118. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_device_hashing.py +0 -0
  119. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_device_manager.py +0 -0
  120. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_file_utils.py +0 -0
  121. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_hli_connector_fakeredis.py +0 -0
  122. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_hli_redis_connector.py +0 -0
  123. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_import_utils.py +0 -0
  124. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_jinja_plugins.py +0 -0
  125. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_lmfit_serializer.py +0 -0
  126. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_managed_config_values.py +0 -0
  127. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_managed_redis_connection.py +0 -0
  128. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_messaging_hooks.py +0 -0
  129. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_messaging_service.py +0 -0
  130. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_metadata_schema.py +0 -0
  131. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_observer.py +0 -0
  132. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_pdf_writer.py +0 -0
  133. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_plugin_helper.py +0 -0
  134. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_plugin_manager.py +0 -0
  135. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_plugin_system.py +0 -0
  136. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_pydantic_pretty_print.py +0 -0
  137. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_queue_items.py +0 -0
  138. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_redis_connector_fakeredis.py +0 -0
  139. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_scan_context.py +0 -0
  140. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_scan_data.py +0 -0
  141. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_scan_history.py +0 -0
  142. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_scan_items.py +0 -0
  143. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_scan_manager.py +0 -0
  144. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_scan_object.py +0 -0
  145. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_scan_repeat.py +0 -0
  146. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_scan_report.py +0 -0
  147. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_scibec_validator.py +0 -0
  148. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_script_executor.py +0 -0
  149. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_serializer.py +0 -0
  150. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_signature_serializer.py +0 -0
  151. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_signature_serializer_with_future_import.py +0 -0
  152. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_stream_subs.py +0 -0
  153. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_user_macros.py +0 -0
  154. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_utils.py +0 -0
  155. {bec_lib-4.0.2 → bec_lib-4.0.3}/tests/test_yaml_loader.py +0 -0
  156. {bec_lib-4.0.2 → bec_lib-4.0.3}/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.0.2
3
+ Version: 4.0.3
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
@@ -254,11 +254,6 @@ class DeviceBase:
254
254
  if self._info:
255
255
  self._parse_info()
256
256
 
257
- # the following lambda is needed to support customized RPC methods with
258
- # doc strings and function signatures.
259
- # pylint: disable=unnecessary-lambda
260
- self.run = lambda *args, **kwargs: self._run(*args, **kwargs)
261
-
262
257
  def _run(self, *args, fcn=None, cached=False, **kwargs):
263
258
  device, func_call = self._get_rpc_func_name(fcn=fcn)
264
259
 
@@ -582,7 +577,12 @@ class DeviceBase:
582
577
  self._custom_rpc_methods[user_access_name] = DeviceBase(
583
578
  name=user_access_name, info=descr, parent=self
584
579
  )
585
- setattr(self, user_access_name, self._custom_rpc_methods[user_access_name].run)
580
+ # Use a separate callable so RPC metadata stays local to each method.
581
+ setattr(
582
+ self,
583
+ user_access_name,
584
+ functools.partial(self._custom_rpc_methods[user_access_name]._run),
585
+ )
586
586
  setattr(getattr(self, user_access_name), "__doc__", descr.get("doc"))
587
587
  setattr(
588
588
  getattr(self, user_access_name),
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "bec_lib"
7
- version = "4.0.2"
7
+ version = "4.0.3"
8
8
  description = "BEC library"
9
9
  requires-python = ">=3.11"
10
10
  classifiers = [
@@ -1,3 +1,4 @@
1
+ import inspect
1
2
  from typing import Any, Callable, Literal
2
3
  from unittest import mock
3
4
 
@@ -25,6 +26,7 @@ from bec_lib.device import (
25
26
  )
26
27
  from bec_lib.devicemanager import DeviceContainer, DeviceManagerBase
27
28
  from bec_lib.endpoints import MessageEndpoints
29
+ from bec_lib.signature_serializer import signature_to_dict
28
30
  from bec_lib.tests.fixtures import device_manager_class
29
31
  from bec_lib.tests.utils import ClientMock, ConnectorMock, get_device_info_mock
30
32
 
@@ -45,6 +47,49 @@ def fixture_dev(bec_client_mock: ClientMock | BECClient):
45
47
  yield bec_client_mock.device_manager.devices
46
48
 
47
49
 
50
+ @pytest.mark.parametrize("device_cls", [DeviceBase, Device, Signal, ComputedSignal, Positioner])
51
+ def test_device_does_not_expose_internal_run(device_cls):
52
+ device = device_cls(name="test")
53
+ assert "run" not in dir(device)
54
+ with pytest.raises(AttributeError):
55
+ getattr(device, "run")
56
+
57
+
58
+ @pytest.mark.parametrize("nested", [False, True])
59
+ def test_custom_rpc_methods_preserve_metadata_and_dispatch(nested, dm_with_override):
60
+ def run(value: int, *, wait: bool = True) -> str:
61
+ """Run the hardware operation."""
62
+
63
+ def other() -> int:
64
+ """Another hardware operation."""
65
+
66
+ methods = {
67
+ method.__name__: {
68
+ "type": "func",
69
+ "doc": method.__doc__,
70
+ "signature": signature_to_dict(method),
71
+ }
72
+ for method in (run, other)
73
+ }
74
+ access = {"controller": {"device_class": "Controller", "info": methods}} if nested else methods
75
+ device = Device(name="test", info={"custom_user_access": access}, parent=dm_with_override)
76
+ target = device.controller if nested else device
77
+ prefix = "controller." if nested else ""
78
+
79
+ for method in (run, other):
80
+ proxy_method = getattr(target, method.__name__)
81
+ assert proxy_method.__doc__ == method.__doc__
82
+ assert inspect.signature(proxy_method) == inspect.signature(method).replace(
83
+ return_annotation=inspect.Signature.empty
84
+ )
85
+ method_device = target._custom_rpc_methods[method.__name__]
86
+ assert not hasattr(method_device, "run")
87
+ with mock.patch.object(method_device, "_run_rpc_call", return_value="result") as rpc_call:
88
+ args, kwargs = ((3,), {"wait": False}) if method is run else ((), {})
89
+ assert proxy_method(*args, **kwargs) == "result"
90
+ rpc_call.assert_called_once_with("test", f"{prefix}{method.__name__}", *args, **kwargs)
91
+
92
+
48
93
  def test_nested_device_root(dev: Any):
49
94
  assert dev.dyn_signals.name == "dyn_signals"
50
95
  assert dev.dyn_signals.messages.name == "messages"
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