From 7d7a88669fcdb47089c5789212ebdd0c92d14a88 Mon Sep 17 00:00:00 2001 From: David Perl Date: Fri, 16 May 2025 10:17:09 +0200 Subject: [PATCH] fix: (#572) signal input base filter use name attribute rather than value from Kind, to compare with kind_str --- bec_widgets/tests/utils.py | 6 +- .../base_classes/device_signal_input_base.py | 56 +++++++++---------- tests/unit_tests/test_device_input_base.py | 11 +++- 3 files changed, 37 insertions(+), 36 deletions(-) diff --git a/bec_widgets/tests/utils.py b/bec_widgets/tests/utils.py index 7e328456..6351180a 100644 --- a/bec_widgets/tests/utils.py +++ b/bec_widgets/tests/utils.py @@ -96,9 +96,9 @@ class FakePositioner(BECPositioner): } self._info = { "signals": { - "readback": {"kind_str": "5"}, # hinted - "setpoint": {"kind_str": "1"}, # normal - "velocity": {"kind_str": "2"}, # config + "readback": {"kind_str": "hinted"}, # hinted + "setpoint": {"kind_str": "normal"}, # normal + "velocity": {"kind_str": "config"}, # config } } self.signals = { diff --git a/bec_widgets/widgets/control/device_input/base_classes/device_signal_input_base.py b/bec_widgets/widgets/control/device_input/base_classes/device_signal_input_base.py index 39e4ba3d..8b008d39 100644 --- a/bec_widgets/widgets/control/device_input/base_classes/device_signal_input_base.py +++ b/bec_widgets/widgets/control/device_input/base_classes/device_signal_input_base.py @@ -36,14 +36,16 @@ class DeviceSignalInputBase(BECWidget): Kind.config: "include_config_signals", } - def __init__(self, client=None, config=None, gui_id: str = None, **kwargs): - if config is None: - config = DeviceSignalInputBaseConfig(widget_class=self.__class__.__name__) - else: - if isinstance(config, dict): - config = DeviceSignalInputBaseConfig(**config) - self.config = config - super().__init__(client=client, config=config, gui_id=gui_id, **kwargs) + def __init__( + self, + client=None, + config: DeviceSignalInputBaseConfig | dict | None = None, + gui_id: str = None, + **kwargs, + ): + + self.config = self._process_config_input(config) + super().__init__(client=client, config=self.config, gui_id=gui_id, **kwargs) self._device = None self.get_bec_shortcuts() @@ -102,10 +104,7 @@ class DeviceSignalInputBase(BECWidget): """ self.config.signal_filter = self.signal_filter # pylint: disable=protected-access - self._hinted_signals = [] - self._normal_signals = [] - self._config_signals = [] - if self.validate_device(self._device) is False: + if not self.validate_device(self._device): self._device = None self.config.device = self._device return @@ -116,27 +115,19 @@ class DeviceSignalInputBase(BECWidget): FilterIO.set_selection(widget=self, selection=[self._device]) return device_info = device._info["signals"] - if Kind.hinted in self.signal_filter: - hinted_signals = [ + + def _update(kind: Kind): + return [ signal for signal, signal_info in device_info.items() - if (signal_info.get("kind_str", None) == str(Kind.hinted.value)) + if kind in self.signal_filter + and (signal_info.get("kind_str", None) == str(kind.name)) ] - self._hinted_signals = hinted_signals - if Kind.normal in self.signal_filter: - normal_signals = [ - signal - for signal, signal_info in device_info.items() - if (signal_info.get("kind_str", None) == str(Kind.normal.value)) - ] - self._normal_signals = normal_signals - if Kind.config in self.signal_filter: - config_signals = [ - signal - for signal, signal_info in device_info.items() - if (signal_info.get("kind_str", None) == str(Kind.config.value)) - ] - self._config_signals = config_signals + + self._hinted_signals = _update(Kind.hinted) + self._normal_signals = _update(Kind.normal) + self._config_signals = _update(Kind.config) + self._signals = self._hinted_signals + self._normal_signals + self._config_signals FilterIO.set_selection(widget=self, selection=self.signals) @@ -279,3 +270,8 @@ class DeviceSignalInputBase(BECWidget): if signal in self.signals: return True return False + + def _process_config_input(self, config: DeviceSignalInputBaseConfig | dict | None): + if config is None: + return DeviceSignalInputBaseConfig(widget_class=self.__class__.__name__) + return DeviceSignalInputBaseConfig.model_validate(config) diff --git a/tests/unit_tests/test_device_input_base.py b/tests/unit_tests/test_device_input_base.py index c8e946c9..02ae550d 100644 --- a/tests/unit_tests/test_device_input_base.py +++ b/tests/unit_tests/test_device_input_base.py @@ -7,6 +7,7 @@ from qtpy.QtWidgets import QWidget from bec_widgets.widgets.control.device_input.base_classes.device_input_base import ( BECDeviceFilter, DeviceInputBase, + DeviceInputConfig, ) from .client_mocks import mocked_client @@ -51,9 +52,13 @@ def test_device_input_base_init_with_config(mocked_client): "default": "samx", } widget = DeviceInputWidget(client=mocked_client, config=config) - assert widget.config.gui_id == "test_gui_id" - assert widget.config.device_filter == ["Positioner"] - assert widget.config.default == "samx" + widget2 = DeviceInputWidget( + client=mocked_client, config=DeviceInputConfig.model_validate(config) + ) + for w in [widget, widget2]: + assert w.config.gui_id == "test_gui_id" + assert w.config.device_filter == ["Positioner"] + assert w.config.default == "samx" def test_device_input_base_set_device_filter(device_input_base):