From 5523ead87c09d3166044246998871c1bd7ec7b7a Mon Sep 17 00:00:00 2001 From: appel_c Date: Wed, 22 Oct 2025 10:11:00 +0200 Subject: [PATCH] refactor(bec-signals): cleanup and fix logic for unify signal in BECMessageSignal --- ophyd_devices/utils/bec_signals.py | 3 ++- tests/test_simulation.py | 33 +----------------------------- tests/test_utils.py | 24 ++++++++++++++++------ 3 files changed, 21 insertions(+), 39 deletions(-) diff --git a/ophyd_devices/utils/bec_signals.py b/ophyd_devices/utils/bec_signals.py index fd992f4..5e5b442 100644 --- a/ophyd_devices/utils/bec_signals.py +++ b/ophyd_devices/utils/bec_signals.py @@ -158,7 +158,8 @@ class BECMessageSignal(Signal): out = [] for signal in signals: if isinstance(signal, str): - out.append((signal, Kind.normal.value)) + kind = Kind.hinted.value if len(signals) == 1 else Kind.normal.value + out.append((signal, kind)) elif isinstance(signal, tuple) and len(signal) == 2: if isinstance(signal[1], Kind): out.append((signal[0], signal[1].value)) diff --git a/tests/test_simulation.py b/tests/test_simulation.py index a759335..28af8d1 100644 --- a/tests/test_simulation.py +++ b/tests/test_simulation.py @@ -838,15 +838,6 @@ def test_waveform_send_async_update(waveform, mode, index, expected_md): wv_shape, ) - # assert np.array_equal(reading[waveform.data.name]["value"], value) - # assert waveform.data.get() - # with mock.patch.object(waveform.connector, "xadd") as mock_xadd: - # waveform._send_async_update(index=index, value=value) - # # Check here that metadata is properly set - # args, kwargs = mock_xadd.call_args - # msg = args[1]["data"] - # assert msg.metadata == expected_md - ##################################### ### Test PSiComponent test device ### @@ -864,29 +855,7 @@ def test_simulation_sim_camera_with_psi_component(test_device): assert test_device.name == "test_device" assert all( element in test_device._signals - for element in [ - "preview_2d", - "preview_1d", - "file_event", - "progress", - "dynamic_signal", - # "async_1d", - # "async_2d", - ] + for element in ["preview_2d", "preview_1d", "file_event", "progress", "dynamic_signal"] ) # No signals are shown when read is called on the device assert test_device.read() == {} - ### Commented out because the async signals are not implemented yet, cf. issue #104 - - # Hinted and normal signals - # assert list(test_device.async_1d.read().keys()) == [ - # "test_device_async_1d_signal1", - # "test_device_async_1d_signal2", - # ] - # assert list(test_device.async_2d.read().keys()) == [ - # "test_device_async_2d_signal1", - # "test_device_async_2d_signal2", - # ] - # # Config signals - # assert "test_device_async_1d_signal3" in test_device.async_1d.read_configuration() - # assert "test_device_async_2d_signal3" in test_device.async_2d.read_configuration() diff --git a/tests/test_utils.py b/tests/test_utils.py index a23be60..49d0247 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,5 +1,6 @@ import threading import time +from functools import partial from unittest import mock import numpy as np @@ -10,7 +11,7 @@ from ophyd import Device, EpicsSignalRO, Signal from ophyd.status import WaitTimeoutError from typeguard import TypeCheckError -from ophyd_devices.tests.utils import MockPV, patch_dual_pvs +from ophyd_devices.tests.utils import MockPV from ophyd_devices.utils.bec_signals import ( AsyncMultiSignal, AsyncSignal, @@ -333,17 +334,23 @@ def test_utils_dynamic_signal(): def test_utils_dynamic_signal_with_defaults(): - """Test DynamicSignal with async_update and acquisition group defaults""" + """ + Test DynamicSignal with async_update and acquisition group defaults. If only + one sub-signal is provided for the dynamic signal, the name of the sub-signal + will be used in the signals dict and a warning will be issued that the sub-signal + name is being ignored. + """ dev = Device(name="device") - signal = DynamicSignal( + create_signal = partial( + DynamicSignal, name="dynamic_signal", + parent=dev, ndim=1, - signals=["sig1", "sig2"], + value=None, async_update={"type": "add", "max_shape": [None, 1000]}, acquisition_group="fly-scanning", - value=None, - parent=dev, ) + signal = create_signal(signals=["sig1", "sig2"]) val = np.random.random(1000) msg_dict = {"dynamic_signal_sig1": {"value": val}} signal.put(msg_dict) @@ -357,6 +364,11 @@ def test_utils_dynamic_signal_with_defaults(): reading = signal.read() assert reading[signal.name]["value"].metadata["acquisition_group"] == "different-group" + # Test init variations for single signal + for signal in [["sig1"], "sig1", None]: + signal = create_signal(signals=signal) + assert signal.signals == [(signal.name, ophyd.Kind.hinted.value)] + def test_utils_async_multi_signal(): """Test AsyncMultiSignal, which is a DynamicSignal with strict signal validation."""