From 65d9320a22dab3f25f0a49529aaf898302958d3e Mon Sep 17 00:00:00 2001 From: Neil Vaytet Date: Mon, 16 Dec 2024 09:32:33 +0100 Subject: [PATCH 1/2] fix initialization of multifile/multistring widget --- src/ess/reduce/widgets/_string_widget.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/ess/reduce/widgets/_string_widget.py b/src/ess/reduce/widgets/_string_widget.py index dc1273f0..c91fb70b 100644 --- a/src/ess/reduce/widgets/_string_widget.py +++ b/src/ess/reduce/widgets/_string_widget.py @@ -27,6 +27,15 @@ def value(self, value: str | None): class MultiStringWidget(StringWidget): + def __init__( + self, description: str, value: tuple[str, ...] | None = None, **kwargs + ): + # Special case handling to allow initialising with a single string + if not isinstance(value, str) and value is not None: + value = ', '.join(value) + + super().__init__(description, value, **kwargs) + @property def value(self) -> tuple[str, ...]: v = super().value From 43b0cdcf7b90a16e000f60623c8f57a97dc61764 Mon Sep 17 00:00:00 2001 From: Neil Vaytet Date: Mon, 16 Dec 2024 10:16:12 +0100 Subject: [PATCH 2/2] add filename widget tests --- pyproject.toml | 1 + tests/widget_test.py | 56 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 51d1935b..7ce8d6ff 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -68,6 +68,7 @@ addopts = """ testpaths = "tests" filterwarnings = [ "error", + 'ignore:\n Sentinel is not a public part of the traitlets API:DeprecationWarning', ] [tool.ruff] diff --git a/tests/widget_test.py b/tests/widget_test.py index 7ef080d3..5c3c8149 100644 --- a/tests/widget_test.py +++ b/tests/widget_test.py @@ -9,7 +9,13 @@ import scipp as sc from ipywidgets import FloatText, IntText -from ess.reduce.parameter import BinEdgesParameter, Parameter, parameter_registry +from ess.reduce.parameter import ( + BinEdgesParameter, + FilenameParameter, + MultiFilenameParameter, + Parameter, + parameter_registry, +) from ess.reduce.ui import ResultBox, WorkflowWidget, workflow_widget from ess.reduce.widgets import OptionalWidget, SwitchWidget, create_parameter_widget from ess.reduce.workflow import register_workflow, workflow_registry @@ -423,3 +429,51 @@ def run_workflow(): ResultBox(run_workflow).run_button.click() assert was_called + + +FilenameSampleRun = NewType('FilenameSampleRun', str) +parameter_registry[FilenameSampleRun] = FilenameParameter.from_type( + FilenameSampleRun, default="SampleRun.hdf" +) +MultiFilenameSampleRun = NewType('MultiFilenameSampleRun', list[str]) +parameter_registry[MultiFilenameSampleRun] = MultiFilenameParameter.from_type( + MultiFilenameSampleRun, default=["file1.hdf", "file2.hdf"] +) +MultiFilenameBackgroundRun = NewType('MultiFilenameBackgroundRun', list[str]) +parameter_registry[MultiFilenameBackgroundRun] = MultiFilenameParameter.from_type( + MultiFilenameBackgroundRun, default="background.hdf" +) + + +def filename_print_provider(fname: FilenameSampleRun) -> str: + return str(fname) + + +def multi_filename_print_provider(fnames: MultiFilenameSampleRun) -> list[str]: + return [str(fname) for fname in fnames] + + +def multi_filename_print_provider_bis(fnames: MultiFilenameBackgroundRun) -> list[str]: + return [str(fname) for fname in fnames] + + +def test_filename_widget_single() -> None: + widget = _ready_widget(providers=[filename_print_provider], output_selections=[str]) + param_widget = _get_param_widget(widget, FilenameSampleRun) + assert param_widget.value == "SampleRun.hdf" + + +def test_filename_widget_multiple() -> None: + widget = _ready_widget( + providers=[multi_filename_print_provider], output_selections=[list[str]] + ) + param_widget = _get_param_widget(widget, MultiFilenameSampleRun) + assert param_widget.value == ("file1.hdf", "file2.hdf") + + +def test_filename_widget_multiple_initialized_with_single_string() -> None: + widget = _ready_widget( + providers=[multi_filename_print_provider_bis], output_selections=[list[str]] + ) + param_widget = _get_param_widget(widget, MultiFilenameBackgroundRun) + assert param_widget.value == ("background.hdf",)