From b0d03c0648cd365143dfed27d4755d6f5b9c7a45 Mon Sep 17 00:00:00 2001 From: David Perl Date: Thu, 12 Jun 2025 13:49:13 +0200 Subject: [PATCH] refactor: rename field widgets --- bec_widgets/utils/forms_from_types/items.py | 28 +++++++-------- .../device_item/device_config_form.py | 8 ++--- tests/unit_tests/test_generated_form_form.py | 12 +++---- tests/unit_tests/test_generated_form_items.py | 10 +++--- tests/unit_tests/test_scan_control.py | 4 +-- tests/unit_tests/test_scan_metadata.py | 34 +++++++++---------- 6 files changed, 45 insertions(+), 51 deletions(-) diff --git a/bec_widgets/utils/forms_from_types/items.py b/bec_widgets/utils/forms_from_types/items.py index dceb4a2c..18d53e6b 100644 --- a/bec_widgets/utils/forms_from_types/items.py +++ b/bec_widgets/utils/forms_from_types/items.py @@ -194,7 +194,7 @@ class DynamicFormItem(QWidget): self.valueChanged.emit() -class StrMetadataField(DynamicFormItem): +class StrFormItem(DynamicFormItem): def __init__(self, parent: QWidget | None = None, *, spec: FormItemSpec) -> None: super().__init__(parent=parent, spec=spec) self._main_widget.textChanged.connect(self._value_changed) @@ -223,7 +223,7 @@ class StrMetadataField(DynamicFormItem): self._main_widget.setText(str(value)) -class IntMetadataField(DynamicFormItem): +class IntFormItem(DynamicFormItem): def __init__(self, parent: QWidget | None = None, *, spec: FormItemSpec) -> None: super().__init__(parent=parent, spec=spec) self._main_widget.textChanged.connect(self._value_changed) @@ -252,7 +252,7 @@ class IntMetadataField(DynamicFormItem): self._main_widget.setValue(value) -class FloatDecimalMetadataField(DynamicFormItem): +class FloatDecimalFormItem(DynamicFormItem): def __init__(self, parent: QWidget | None = None, *, spec: FormItemSpec) -> None: super().__init__(parent=parent, spec=spec) self._main_widget.textChanged.connect(self._value_changed) @@ -286,7 +286,7 @@ class FloatDecimalMetadataField(DynamicFormItem): self._main_widget.setValue(float(value)) -class BoolMetadataField(DynamicFormItem): +class BoolFormItem(DynamicFormItem): def __init__(self, *, parent: QWidget | None = None, spec: FormItemSpec) -> None: super().__init__(parent=parent, spec=spec) self._main_widget.stateChanged.connect(self._value_changed) @@ -307,7 +307,7 @@ class BoolMetadataField(DynamicFormItem): self._main_widget.setChecked(value) -class BoolToggleMetadataField(BoolMetadataField): +class BoolToggleFormItem(BoolFormItem): def __init__(self, *, parent: QWidget | None = None, spec: FormItemSpec) -> None: if spec.info.default is PydanticUndefined: spec.info.default = False @@ -321,7 +321,7 @@ class BoolToggleMetadataField(BoolMetadataField): self._main_widget.setChecked(self._default) -class DictMetadataField(DynamicFormItem): +class DictFormItem(DynamicFormItem): def __init__(self, *, parent: QWidget | None = None, spec: FormItemSpec) -> None: super().__init__(parent=parent, spec=spec) self._main_widget.data_changed.connect(self._value_changed) @@ -351,7 +351,7 @@ class _ItemAndWidgetType(NamedTuple): default: int | float | str -class ListMetadataField(DynamicFormItem): +class ListFormItem(DynamicFormItem): def __init__(self, *, parent: QWidget | None = None, spec: FormItemSpec) -> None: super().__init__(parent=parent, spec=spec) self._main_widget: QListWidget @@ -440,22 +440,22 @@ WidgetTypeRegistry = dict[ ] DEFAULT_WIDGET_TYPES: Final[WidgetTypeRegistry] = { - "str": (lambda anno: anno in [str, str | None, None], StrMetadataField), - "int": (lambda anno: anno in [int, int | None], IntMetadataField), + "str": (lambda anno: anno in [str, str | None, None], StrFormItem), + "int": (lambda anno: anno in [int, int | None], IntFormItem), "float_decimal": ( lambda anno: anno in [float, float | None, Decimal, Decimal | None], - FloatDecimalMetadataField, + FloatDecimalFormItem, ), - "bool": (lambda anno: anno in [bool, bool | None], BoolMetadataField), + "bool": (lambda anno: anno in [bool, bool | None], BoolFormItem), "dict": ( lambda anno: anno in [dict, dict | None] or (isinstance(anno, GenericAlias) and anno.__origin__ is dict), - DictMetadataField, + DictFormItem, ), "list": ( lambda anno: anno in [list, list | None] or (isinstance(anno, GenericAlias) and anno.__origin__ is list), - ListMetadataField, + ListFormItem, ), } @@ -468,7 +468,7 @@ def widget_from_type( if predicate(annotation): return widget_type logger.warning(f"Type {annotation} is not (yet) supported in metadata form creation.") - return StrMetadataField + return StrFormItem if __name__ == "__main__": # pragma: no cover diff --git a/bec_widgets/widgets/services/device_browser/device_item/device_config_form.py b/bec_widgets/widgets/services/device_browser/device_item/device_config_form.py index 6914d489..f1f17fed 100644 --- a/bec_widgets/widgets/services/device_browser/device_item/device_config_form.py +++ b/bec_widgets/widgets/services/device_browser/device_item/device_config_form.py @@ -11,8 +11,8 @@ from bec_widgets.utils.forms_from_types import styles from bec_widgets.utils.forms_from_types.forms import PydanticModelForm from bec_widgets.utils.forms_from_types.items import ( DEFAULT_WIDGET_TYPES, - BoolMetadataField, - BoolToggleMetadataField, + BoolFormItem, + BoolToggleFormItem, widget_from_type, ) @@ -30,8 +30,8 @@ class DeviceConfigForm(PydanticModelForm): **kwargs, ) self._widget_types = DEFAULT_WIDGET_TYPES.copy() - self._widget_types["bool"] = (lambda anno: anno is bool, BoolToggleMetadataField) - self._widget_types["optional_bool"] = (lambda anno: anno == bool | None, BoolMetadataField) + self._widget_types["bool"] = (lambda anno: anno is bool, BoolToggleFormItem) + self._widget_types["optional_bool"] = (lambda anno: anno == bool | None, BoolFormItem) self._validity.setVisible(False) self._connect_to_theme_change() self.populate() diff --git a/tests/unit_tests/test_generated_form_form.py b/tests/unit_tests/test_generated_form_form.py index bc3f73d5..46350381 100644 --- a/tests/unit_tests/test_generated_form_form.py +++ b/tests/unit_tests/test_generated_form_form.py @@ -4,11 +4,7 @@ import pytest from pydantic import BaseModel, Field from bec_widgets.utils.forms_from_types.forms import PydanticModelForm, TypedForm -from bec_widgets.utils.forms_from_types.items import ( - FloatDecimalMetadataField, - IntMetadataField, - StrMetadataField, -) +from bec_widgets.utils.forms_from_types.items import FloatDecimalFormItem, IntFormItem, StrFormItem # pylint: disable=no-member # pylint: disable=missing-function-docstring @@ -58,9 +54,9 @@ def model_widget(qtbot): def test_widget_dict(model_widget: PydanticModelForm): - assert isinstance(model_widget.widget_dict["str_optional"], StrMetadataField) - assert isinstance(model_widget.widget_dict["float_nodefault"], FloatDecimalMetadataField) - assert isinstance(model_widget.widget_dict["int_default"], IntMetadataField) + assert isinstance(model_widget.widget_dict["str_optional"], StrFormItem) + assert isinstance(model_widget.widget_dict["float_nodefault"], FloatDecimalFormItem) + assert isinstance(model_widget.widget_dict["int_default"], IntFormItem) def test_widget_set_data(model_widget: PydanticModelForm): diff --git a/tests/unit_tests/test_generated_form_items.py b/tests/unit_tests/test_generated_form_items.py index 3cd1ec80..0f4a0abd 100644 --- a/tests/unit_tests/test_generated_form_items.py +++ b/tests/unit_tests/test_generated_form_items.py @@ -5,7 +5,7 @@ import pytest from pydantic import ValidationError from pydantic.fields import FieldInfo -from bec_widgets.utils.forms_from_types.items import FormItemSpec, ListMetadataField +from bec_widgets.utils.forms_from_types.items import FormItemSpec, ListFormItem from bec_widgets.utils.widget_io import WidgetIO @@ -75,12 +75,12 @@ def list_field_and_values(request, qtbot): request.param.get("extra"), ) spec = FormItemSpec(item_type=itype, name="test_list", info=FieldInfo(annotation=itype)) - (widget := ListMetadataField(parent=None, spec=spec)).setValue(vals) + (widget := ListFormItem(parent=None, spec=spec)).setValue(vals) qtbot.addWidget(widget) yield widget, vals, extra, get_args(itype)[0] -def test_list_metadata_field(list_field_and_values: tuple[ListMetadataField, list, Any, type]): +def test_list_metadata_field(list_field_and_values: tuple[ListFormItem, list, Any, type]): list_field, vals, extra, _ = list_field_and_values assert list_field.getValue() == vals assert list_field._main_widget.count() == 3 @@ -109,9 +109,7 @@ def test_list_metadata_field(list_field_and_values: tuple[ListMetadataField, lis assert list_field.getValue() == [vals[0], extra, list_field._types.default, extra] -def test_list_field_value_acceptance( - list_field_and_values: tuple[ListMetadataField, list, Any, type], -): +def test_list_field_value_acceptance(list_field_and_values: tuple[ListFormItem, list, Any, type]): class _WrongType(object): ... list_field, _, _, t = list_field_and_values diff --git a/tests/unit_tests/test_scan_control.py b/tests/unit_tests/test_scan_control.py index 9696809a..4d38feb9 100644 --- a/tests/unit_tests/test_scan_control.py +++ b/tests/unit_tests/test_scan_control.py @@ -7,7 +7,7 @@ from bec_lib.endpoints import MessageEndpoints from bec_lib.messages import AvailableResourceMessage, ScanQueueHistoryMessage, ScanQueueMessage from qtpy.QtCore import QModelIndex, Qt -from bec_widgets.utils.forms_from_types.items import StrMetadataField +from bec_widgets.utils.forms_from_types.items import StrFormItem from bec_widgets.utils.widget_io import WidgetIO from bec_widgets.widgets.control.scan_control import ScanControl @@ -570,7 +570,7 @@ def test_scan_metadata_is_connected(scan_control): scan_control.comboBox_scan_selection.setCurrentText("grid_scan") assert scan_control._metadata_form._scan_name == "grid_scan" sample_name = scan_control._metadata_form._form_grid.layout().itemAtPosition(0, 1).widget() - assert isinstance(sample_name, StrMetadataField) + assert isinstance(sample_name, StrFormItem) sample_name._main_widget.setText("Test Sample") scan_control._metadata_form._additional_metadata._table_model._data = TEST_TABLE_ENTRY diff --git a/tests/unit_tests/test_scan_metadata.py b/tests/unit_tests/test_scan_metadata.py index 7d26057f..7f054d21 100644 --- a/tests/unit_tests/test_scan_metadata.py +++ b/tests/unit_tests/test_scan_metadata.py @@ -8,12 +8,12 @@ from pydantic.types import Json from qtpy.QtCore import QItemSelectionModel, QPoint, Qt from bec_widgets.utils.forms_from_types.items import ( - BoolMetadataField, - DictMetadataField, + BoolFormItem, + DictFormItem, DynamicFormItem, - FloatDecimalMetadataField, - IntMetadataField, - StrMetadataField, + FloatDecimalFormItem, + IntFormItem, + StrFormItem, ) from bec_widgets.widgets.editors.dict_backed_table import DictBackedTable from bec_widgets.widgets.editors.scan_metadata.scan_metadata import ScanMetadata @@ -125,18 +125,18 @@ def test_griditems_are_correct_class( metadata_widget: tuple[ScanMetadata, dict[str, DynamicFormItem]], ): _, components = metadata_widget - assert isinstance(components["sample_name"], StrMetadataField) - assert isinstance(components["str_optional"], StrMetadataField) - assert isinstance(components["str_required"], StrMetadataField) - assert isinstance(components["bool_optional"], BoolMetadataField) - assert isinstance(components["bool_required_default"], BoolMetadataField) - assert isinstance(components["bool_required_nodefault"], BoolMetadataField) - assert isinstance(components["int_default"], IntMetadataField) - assert isinstance(components["int_nodefault_optional"], IntMetadataField) - assert isinstance(components["float_nodefault"], FloatDecimalMetadataField) - assert isinstance(components["decimal_dp_limits_nodefault"], FloatDecimalMetadataField) - assert isinstance(components["dict_default"], DictMetadataField) - assert isinstance(components["unsupported_class"], StrMetadataField) + assert isinstance(components["sample_name"], StrFormItem) + assert isinstance(components["str_optional"], StrFormItem) + assert isinstance(components["str_required"], StrFormItem) + assert isinstance(components["bool_optional"], BoolFormItem) + assert isinstance(components["bool_required_default"], BoolFormItem) + assert isinstance(components["bool_required_nodefault"], BoolFormItem) + assert isinstance(components["int_default"], IntFormItem) + assert isinstance(components["int_nodefault_optional"], IntFormItem) + assert isinstance(components["float_nodefault"], FloatDecimalFormItem) + assert isinstance(components["decimal_dp_limits_nodefault"], FloatDecimalFormItem) + assert isinstance(components["dict_default"], DictFormItem) + assert isinstance(components["unsupported_class"], StrFormItem) def test_grid_to_dict(metadata_widget: tuple[ScanMetadata, dict[str, DynamicFormItem]]):