From b8740c95941d36102f07a51d74a50e6f262a6646 Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Fri, 15 May 2026 12:26:40 +0200 Subject: [PATCH] fix(scan-control): skip duplicate visible scan kwargs --- .../control/scan_control/scan_info_adapter.py | 4 +++ tests/unit_tests/test_scan_control.py | 33 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/bec_widgets/widgets/control/scan_control/scan_info_adapter.py b/bec_widgets/widgets/control/scan_control/scan_info_adapter.py index dba99f62..34709dbd 100644 --- a/bec_widgets/widgets/control/scan_control/scan_info_adapter.py +++ b/bec_widgets/widgets/control/scan_control/scan_info_adapter.py @@ -229,15 +229,19 @@ class ScanInfoAdapter: kwarg_groups = [] arg_names = set(arg_input) if isinstance(arg_input, dict) else set() + visible_kwarg_names = set() for group_name, input_names in gui_visualization.items(): inputs = [] for input_name in input_names: if input_name in arg_names or input_name not in signature_by_name: continue + if input_name in visible_kwarg_names: + continue param = signature_by_name[input_name] if param.get("kind") in ("VAR_POSITIONAL", "VAR_KEYWORD"): continue inputs.append(self.scan_input_from_signature(param)) + visible_kwarg_names.add(input_name) if inputs: kwarg_groups.append({"name": group_name, "inputs": inputs}) diff --git a/tests/unit_tests/test_scan_control.py b/tests/unit_tests/test_scan_control.py index dc905bc0..ad6dc827 100644 --- a/tests/unit_tests/test_scan_control.py +++ b/tests/unit_tests/test_scan_control.py @@ -406,6 +406,39 @@ def test_scan_control_uses_gui_visibility_and_signature(qtbot, mocked_client): assert widget.kwarg_boxes[1].layout.itemAtPosition(0, 0).widget().text() == "Exp Time" assert "Exposure time\nUnits: s" in widget.kwarg_boxes[1].widgets[0].toolTip() +def test_scan_info_adapter_skips_duplicate_visible_kwargs(): + scan_info = { + "class": "DuplicateScan", + "base_class": "ScanBaseV4", + "arg_input": {}, + "arg_bundle_size": {"bundle": 0, "min": None, "max": None}, + "gui_visibility": { + "Scan Parameters": ["relative", "burst_at_each_point"], + "Acquisition Parameters": ["exp_time", "burst_at_each_point"], + }, + "signature": [ + {"name": "relative", "kind": "KEYWORD_ONLY", "default": False, "annotation": "bool"}, + { + "name": "burst_at_each_point", + "kind": "KEYWORD_ONLY", + "default": 1, + "annotation": "int", + }, + {"name": "exp_time", "kind": "KEYWORD_ONLY", "default": 0, "annotation": "float"}, + ], + } + + gui_config = ScanInfoAdapter().build_scan_ui_config(scan_info) + groups = { + group["name"]: [input_spec["name"] for input_spec in group["inputs"]] + for group in gui_config["kwarg_groups"] + } + + assert groups == { + "Scan Parameters": ["relative", "burst_at_each_point"], + "Acquisition Parameters": ["exp_time"], + } + def test_scan_control_propagates_reference_units_across_kwarg_groups(qtbot, mocked_client): scan_info = {