Loading src/nova/trame/view/components/ornl/neutron_data_selector.py +19 −18 Original line number Diff line number Diff line Loading @@ -33,7 +33,6 @@ class NeutronDataSelector(DataSelector): instrument: Union[str, Tuple] = "", experiment: Union[str, Tuple] = "", extensions: Union[List[str], Tuple, None] = None, prefix: Union[str, Tuple] = "", subdirectory: Union[str, Tuple] = "", refresh_rate: Union[int, Tuple] = 30, select_strategy: Union[str, Tuple] = "all", Loading @@ -57,8 +56,6 @@ class NeutronDataSelector(DataSelector): The experiment to restrict data selection to. extensions : Union[List[str], Tuple], optional A list of file extensions to restrict selection to. If unset, then all files will be shown. prefix : Union[str, Tuple], optional Deprecated. Please refer to the `subdirectory` parameter. subdirectory : Union[str, Tuple], optional A subdirectory within the user's chosen experiment to show files. If not specified as a string, the user will be shown a folder browser and will be able to see all files in the experiment that they have access to. Loading @@ -80,14 +77,12 @@ class NeutronDataSelector(DataSelector): warn("allow_custom_directories will be ignored since the facility parameter is fixed.", stacklevel=1) self._facility = facility self._last_facility = get_state_param(self.state, self._facility) self._instrument = instrument self._last_instrument = get_state_param(self.state, self._instrument) self._experiment = experiment self._last_experiment = get_state_param(self.state, self._experiment) self._allow_custom_directories = allow_custom_directories self._last_allow_custom_directories = self._allow_custom_directories self._state_name = f"nova__dataselector_{self._next_id}_state" self._facilities_name = f"nova__neutrondataselector_{self._next_id}_facilities" self._selected_facility_name = ( self._facility[0] if isinstance(self._facility, tuple) else f"{self._state_name}.facility" Loading Loading @@ -164,9 +159,9 @@ class NeutronDataSelector(DataSelector): def on_update(self, results: Dict[str, Any]) -> None: self._vm.set_binding_parameters( facility=get_state_param(self.state, self._facility), instrument=get_state_param(self.state, self._instrument), experiment=get_state_param(self.state, self._experiment), facility=get_state_param(self.state, self._selected_facility_name), instrument=get_state_param(self.state, self._selected_instrument_name), experiment=get_state_param(self.state, self._selected_experiment_name), allow_custom_directories=get_state_param(self.state, self._allow_custom_directories), ) Loading @@ -176,6 +171,10 @@ class NeutronDataSelector(DataSelector): set_state_param(self.state, self._experiment) set_state_param(self.state, self._allow_custom_directories) self._last_facility = get_state_param(self.state, self._facility) self._last_instrument = get_state_param(self.state, self._instrument) self._last_experiment = get_state_param(self.state, self._experiment) self._vm.set_binding_parameters( facility=get_state_param(self.state, self._facility), instrument=get_state_param(self.state, self._instrument), Loading @@ -190,7 +189,9 @@ class NeutronDataSelector(DataSelector): facility = rgetdictvalue(kwargs, self._facility[0]) if facility != self._last_facility: self._last_facility = facility self._vm.set_binding_parameters(facility=set_state_param(self.state, self._facility, facility)) self._vm.set_binding_parameters( facility=set_state_param(self.state, (self._selected_facility_name,), facility) ) self._vm.reset() if isinstance(self._instrument, tuple): Loading @@ -201,7 +202,7 @@ class NeutronDataSelector(DataSelector): if instrument != self._last_instrument: self._last_instrument = instrument self._vm.set_binding_parameters( instrument=set_state_param(self.state, self._instrument, instrument) instrument=set_state_param(self.state, (self._selected_instrument_name,), instrument) ) self._vm.reset() Loading @@ -213,7 +214,7 @@ class NeutronDataSelector(DataSelector): if experiment != self._last_experiment: self._last_experiment = experiment self._vm.set_binding_parameters( experiment=set_state_param(self.state, self._experiment, experiment) experiment=set_state_param(self.state, (self._selected_experiment_name,), experiment) ) self._vm.reset() Loading @@ -232,21 +233,21 @@ class NeutronDataSelector(DataSelector): def update_facility(self, facility: str) -> None: self._vm.set_binding_parameters( facility=set_state_param(self.state, self._facility, facility), instrument=set_state_param(self.state, self._instrument, ""), experiment=set_state_param(self.state, self._experiment, ""), facility=set_state_param(self.state, (self._selected_facility_name,), facility), instrument=set_state_param(self.state, (self._selected_instrument_name,), ""), experiment=set_state_param(self.state, (self._selected_experiment_name,), ""), ) self._vm.reset() def update_instrument(self, instrument: str) -> None: self._vm.set_binding_parameters( instrument=set_state_param(self.state, self._instrument, instrument), experiment=set_state_param(self.state, self._experiment, ""), instrument=set_state_param(self.state, (self._selected_instrument_name,), instrument), experiment=set_state_param(self.state, (self._selected_experiment_name,), ""), ) self._vm.reset() def update_experiment(self, experiment: str) -> None: self._vm.set_binding_parameters( experiment=set_state_param(self.state, self._experiment, experiment), experiment=set_state_param(self.state, (self._selected_experiment_name,), experiment), ) self._vm.reset() tests/test_data_selector.py +45 −25 Original line number Diff line number Diff line """Unit tests for DataSelector.""" from warnings import catch_warnings from typing import List from pydantic import BaseModel, Field from trame.app import get_server from trame_server.core import Server from nova.trame.view.components.ornl import NeutronDataSelector from nova.mvvm.trame_binding import TrameBinding from nova.trame.view.components import DataSelector from nova.trame.view.theme import ThemedApp Loading @@ -19,30 +21,48 @@ def test_data_selector() -> None: def create_ui(self) -> None: with super().create_ui() as layout: with layout.content: input = NeutronDataSelector(v_model="test", extensions=[".tiff"]) input = DataSelector(v_model="test", directory="/", extensions=[".tiff"]) assert input.v_model == "test" assert input._directory == "/" assert input._extensions == [".tiff"] assert input._model.state.facility == "" assert input._model.state.instrument == "" assert input._model.state.experiment == "" input.set_state(facility="HFIR", instrument="CG-2", experiment="IPTS-27744") assert input._model.state.facility == "HFIR" assert input._model.state.instrument == "CG-2" assert input._model.state.experiment == "IPTS-27744" with catch_warnings(record=True) as captured_warnings: input.set_state(facility="NSS") assert str(captured_warnings[0].message).startswith("Facility 'NSS' could not be found.") with catch_warnings(record=True) as captured_warnings: NeutronDataSelector(v_model="test", facility="HIFR") assert str(captured_warnings[0].message).startswith("Facility 'HIFR' could not be found.") with catch_warnings(record=True) as captured_warnings: NeutronDataSelector(v_model="test", facility="SNS", instrument="BL1B") assert str(captured_warnings[0].message).startswith( "Instrument 'BL1B' could not be found in 'SNS'." MyTrameApp() def test_parameter_bindings() -> None: class TestModel(BaseModel): v_model: List[str] = Field(default=[]) directory: str = Field(default="") extensions: List[str] = Field(default=[]) prefix: str = Field(default="") refresh_rate: int = Field(default=0) select_strategy: str = Field(default="") class MyTrameApp(ThemedApp): def __init__(self, server: Server = None) -> None: self.server = get_server(None, client_type="vue3") super().__init__(server=self.server) self.create_binding() self.create_ui() def create_binding(self) -> None: self.test_obj = TestModel() binding = TrameBinding(self.server.state) self.test_binding = binding.new_bind(self.test_obj) self.test_binding.connect("test_ds") def create_ui(self) -> None: with super().create_ui() as layout: with layout.content: DataSelector( v_model=("test_ds.v_model", ["test.txt"]), directory=("test_ds.directory", "/"), extensions=("test_ds.extensions", [".txt"]), prefix=("test_ds.prefix", "bin"), refresh_rate=("test_ds.refresh_rate", 15), select_strategy=("test_ds.select_strategy", "page"), ) MyTrameApp() tests/test_neutron_data_selector.py 0 → 100644 +87 −0 Original line number Diff line number Diff line """Unit tests for NeutronDataSelector.""" from typing import List from warnings import catch_warnings from pydantic import BaseModel, Field from trame.app import get_server from trame_server.core import Server from nova.mvvm.trame_binding import TrameBinding from nova.trame.view.components.ornl import NeutronDataSelector from nova.trame.view.theme import ThemedApp def test_data_selector() -> None: class MyTrameApp(ThemedApp): def __init__(self, server: Server = None) -> None: server = get_server(None, client_type="vue3") super().__init__(server=server) self.create_ui() def create_ui(self) -> None: with super().create_ui() as layout: with layout.content: input = NeutronDataSelector(v_model="test", extensions=[".tiff"]) assert input.v_model == "test" assert input._extensions == [".tiff"] assert input._model.state.facility == "" assert input._model.state.instrument == "" assert input._model.state.experiment == "" input.update_facility("HFIR") input.update_instrument("CG-2") input.update_experiment("IPTS-27744") with catch_warnings(record=True) as captured_warnings: input.update_facility(facility="NSS") assert str(captured_warnings[0].message).startswith("Facility 'NSS' could not be found.") with catch_warnings(record=True) as captured_warnings: NeutronDataSelector(v_model="test", facility="HIFR") assert str(captured_warnings[0].message).startswith("Facility 'HIFR' could not be found.") with catch_warnings(record=True) as captured_warnings: NeutronDataSelector(v_model="test", facility="SNS", instrument="BL1B") assert str(captured_warnings[0].message).startswith( "Instrument 'BL1B' could not be found in 'SNS'." ) MyTrameApp() def test_parameter_bindings() -> None: class TestModel(BaseModel): v_model: List[str] = Field(default=[]) facility: str = Field(default="") instrument: str = Field(default="") experiment: str = Field(default="") allow_custom_directories: bool = Field(default=False) class MyTrameApp(ThemedApp): def __init__(self, server: Server = None) -> None: self.server = get_server(None, client_type="vue3") super().__init__(server=self.server) self.create_binding() self.create_ui() def create_binding(self) -> None: self.test_obj = TestModel() binding = TrameBinding(self.server.state) self.test_binding = binding.new_bind(self.test_obj) self.test_binding.connect("test_nds") def create_ui(self) -> None: with super().create_ui() as layout: with layout.content: NeutronDataSelector( v_model=("test_nds.v_model", ["test.txt"]), facility=("test_nds.facility", "SNS"), instrument=("test_nds.instrument", "BL-12"), experiment=("test_nds.experiment",), allow_custom_directories=("test_nds.allow_custom_directories", True), ) MyTrameApp() tests/test_parameter_bindings.pydeleted 100644 → 0 +0 −50 Original line number Diff line number Diff line """Unit tests for DataSelector.""" from typing import List from pydantic import BaseModel, Field from trame.app import get_server from trame_server.core import Server from nova.mvvm.trame_binding import TrameBinding from nova.trame.view.components import DataSelector from nova.trame.view.theme import ThemedApp def test_parameter_bindings() -> None: class TestModel(BaseModel): v_model: List[str] = Field(default=[]) directory: str = Field(default="") extensions: List[str] = Field(default=[]) prefix: str = Field(default="") refresh_rate: int = Field(default=0) select_strategy: str = Field(default="") class MyTrameApp(ThemedApp): def __init__(self, server: Server = None) -> None: self.server = get_server(None, client_type="vue3") super().__init__(server=self.server) self.create_binding() self.create_ui() def create_binding(self) -> None: self.test_obj = TestModel() binding = TrameBinding(self.server.state) self.test_binding = binding.new_bind(self.test_obj) self.test_binding.connect("test_ds") def create_ui(self) -> None: with super().create_ui() as layout: with layout.content: DataSelector( v_model=("test_ds.v_model", ["test.txt"]), directory=("test_ds.directory", "/"), extensions=("test_ds.extensions", [".txt"]), prefix=("test_ds.prefix", "bin"), refresh_rate=("test_ds.refresh_rate", 15), select_strategy=("test_ds.select_strategy", "page"), ) MyTrameApp() Loading
src/nova/trame/view/components/ornl/neutron_data_selector.py +19 −18 Original line number Diff line number Diff line Loading @@ -33,7 +33,6 @@ class NeutronDataSelector(DataSelector): instrument: Union[str, Tuple] = "", experiment: Union[str, Tuple] = "", extensions: Union[List[str], Tuple, None] = None, prefix: Union[str, Tuple] = "", subdirectory: Union[str, Tuple] = "", refresh_rate: Union[int, Tuple] = 30, select_strategy: Union[str, Tuple] = "all", Loading @@ -57,8 +56,6 @@ class NeutronDataSelector(DataSelector): The experiment to restrict data selection to. extensions : Union[List[str], Tuple], optional A list of file extensions to restrict selection to. If unset, then all files will be shown. prefix : Union[str, Tuple], optional Deprecated. Please refer to the `subdirectory` parameter. subdirectory : Union[str, Tuple], optional A subdirectory within the user's chosen experiment to show files. If not specified as a string, the user will be shown a folder browser and will be able to see all files in the experiment that they have access to. Loading @@ -80,14 +77,12 @@ class NeutronDataSelector(DataSelector): warn("allow_custom_directories will be ignored since the facility parameter is fixed.", stacklevel=1) self._facility = facility self._last_facility = get_state_param(self.state, self._facility) self._instrument = instrument self._last_instrument = get_state_param(self.state, self._instrument) self._experiment = experiment self._last_experiment = get_state_param(self.state, self._experiment) self._allow_custom_directories = allow_custom_directories self._last_allow_custom_directories = self._allow_custom_directories self._state_name = f"nova__dataselector_{self._next_id}_state" self._facilities_name = f"nova__neutrondataselector_{self._next_id}_facilities" self._selected_facility_name = ( self._facility[0] if isinstance(self._facility, tuple) else f"{self._state_name}.facility" Loading Loading @@ -164,9 +159,9 @@ class NeutronDataSelector(DataSelector): def on_update(self, results: Dict[str, Any]) -> None: self._vm.set_binding_parameters( facility=get_state_param(self.state, self._facility), instrument=get_state_param(self.state, self._instrument), experiment=get_state_param(self.state, self._experiment), facility=get_state_param(self.state, self._selected_facility_name), instrument=get_state_param(self.state, self._selected_instrument_name), experiment=get_state_param(self.state, self._selected_experiment_name), allow_custom_directories=get_state_param(self.state, self._allow_custom_directories), ) Loading @@ -176,6 +171,10 @@ class NeutronDataSelector(DataSelector): set_state_param(self.state, self._experiment) set_state_param(self.state, self._allow_custom_directories) self._last_facility = get_state_param(self.state, self._facility) self._last_instrument = get_state_param(self.state, self._instrument) self._last_experiment = get_state_param(self.state, self._experiment) self._vm.set_binding_parameters( facility=get_state_param(self.state, self._facility), instrument=get_state_param(self.state, self._instrument), Loading @@ -190,7 +189,9 @@ class NeutronDataSelector(DataSelector): facility = rgetdictvalue(kwargs, self._facility[0]) if facility != self._last_facility: self._last_facility = facility self._vm.set_binding_parameters(facility=set_state_param(self.state, self._facility, facility)) self._vm.set_binding_parameters( facility=set_state_param(self.state, (self._selected_facility_name,), facility) ) self._vm.reset() if isinstance(self._instrument, tuple): Loading @@ -201,7 +202,7 @@ class NeutronDataSelector(DataSelector): if instrument != self._last_instrument: self._last_instrument = instrument self._vm.set_binding_parameters( instrument=set_state_param(self.state, self._instrument, instrument) instrument=set_state_param(self.state, (self._selected_instrument_name,), instrument) ) self._vm.reset() Loading @@ -213,7 +214,7 @@ class NeutronDataSelector(DataSelector): if experiment != self._last_experiment: self._last_experiment = experiment self._vm.set_binding_parameters( experiment=set_state_param(self.state, self._experiment, experiment) experiment=set_state_param(self.state, (self._selected_experiment_name,), experiment) ) self._vm.reset() Loading @@ -232,21 +233,21 @@ class NeutronDataSelector(DataSelector): def update_facility(self, facility: str) -> None: self._vm.set_binding_parameters( facility=set_state_param(self.state, self._facility, facility), instrument=set_state_param(self.state, self._instrument, ""), experiment=set_state_param(self.state, self._experiment, ""), facility=set_state_param(self.state, (self._selected_facility_name,), facility), instrument=set_state_param(self.state, (self._selected_instrument_name,), ""), experiment=set_state_param(self.state, (self._selected_experiment_name,), ""), ) self._vm.reset() def update_instrument(self, instrument: str) -> None: self._vm.set_binding_parameters( instrument=set_state_param(self.state, self._instrument, instrument), experiment=set_state_param(self.state, self._experiment, ""), instrument=set_state_param(self.state, (self._selected_instrument_name,), instrument), experiment=set_state_param(self.state, (self._selected_experiment_name,), ""), ) self._vm.reset() def update_experiment(self, experiment: str) -> None: self._vm.set_binding_parameters( experiment=set_state_param(self.state, self._experiment, experiment), experiment=set_state_param(self.state, (self._selected_experiment_name,), experiment), ) self._vm.reset()
tests/test_data_selector.py +45 −25 Original line number Diff line number Diff line """Unit tests for DataSelector.""" from warnings import catch_warnings from typing import List from pydantic import BaseModel, Field from trame.app import get_server from trame_server.core import Server from nova.trame.view.components.ornl import NeutronDataSelector from nova.mvvm.trame_binding import TrameBinding from nova.trame.view.components import DataSelector from nova.trame.view.theme import ThemedApp Loading @@ -19,30 +21,48 @@ def test_data_selector() -> None: def create_ui(self) -> None: with super().create_ui() as layout: with layout.content: input = NeutronDataSelector(v_model="test", extensions=[".tiff"]) input = DataSelector(v_model="test", directory="/", extensions=[".tiff"]) assert input.v_model == "test" assert input._directory == "/" assert input._extensions == [".tiff"] assert input._model.state.facility == "" assert input._model.state.instrument == "" assert input._model.state.experiment == "" input.set_state(facility="HFIR", instrument="CG-2", experiment="IPTS-27744") assert input._model.state.facility == "HFIR" assert input._model.state.instrument == "CG-2" assert input._model.state.experiment == "IPTS-27744" with catch_warnings(record=True) as captured_warnings: input.set_state(facility="NSS") assert str(captured_warnings[0].message).startswith("Facility 'NSS' could not be found.") with catch_warnings(record=True) as captured_warnings: NeutronDataSelector(v_model="test", facility="HIFR") assert str(captured_warnings[0].message).startswith("Facility 'HIFR' could not be found.") with catch_warnings(record=True) as captured_warnings: NeutronDataSelector(v_model="test", facility="SNS", instrument="BL1B") assert str(captured_warnings[0].message).startswith( "Instrument 'BL1B' could not be found in 'SNS'." MyTrameApp() def test_parameter_bindings() -> None: class TestModel(BaseModel): v_model: List[str] = Field(default=[]) directory: str = Field(default="") extensions: List[str] = Field(default=[]) prefix: str = Field(default="") refresh_rate: int = Field(default=0) select_strategy: str = Field(default="") class MyTrameApp(ThemedApp): def __init__(self, server: Server = None) -> None: self.server = get_server(None, client_type="vue3") super().__init__(server=self.server) self.create_binding() self.create_ui() def create_binding(self) -> None: self.test_obj = TestModel() binding = TrameBinding(self.server.state) self.test_binding = binding.new_bind(self.test_obj) self.test_binding.connect("test_ds") def create_ui(self) -> None: with super().create_ui() as layout: with layout.content: DataSelector( v_model=("test_ds.v_model", ["test.txt"]), directory=("test_ds.directory", "/"), extensions=("test_ds.extensions", [".txt"]), prefix=("test_ds.prefix", "bin"), refresh_rate=("test_ds.refresh_rate", 15), select_strategy=("test_ds.select_strategy", "page"), ) MyTrameApp()
tests/test_neutron_data_selector.py 0 → 100644 +87 −0 Original line number Diff line number Diff line """Unit tests for NeutronDataSelector.""" from typing import List from warnings import catch_warnings from pydantic import BaseModel, Field from trame.app import get_server from trame_server.core import Server from nova.mvvm.trame_binding import TrameBinding from nova.trame.view.components.ornl import NeutronDataSelector from nova.trame.view.theme import ThemedApp def test_data_selector() -> None: class MyTrameApp(ThemedApp): def __init__(self, server: Server = None) -> None: server = get_server(None, client_type="vue3") super().__init__(server=server) self.create_ui() def create_ui(self) -> None: with super().create_ui() as layout: with layout.content: input = NeutronDataSelector(v_model="test", extensions=[".tiff"]) assert input.v_model == "test" assert input._extensions == [".tiff"] assert input._model.state.facility == "" assert input._model.state.instrument == "" assert input._model.state.experiment == "" input.update_facility("HFIR") input.update_instrument("CG-2") input.update_experiment("IPTS-27744") with catch_warnings(record=True) as captured_warnings: input.update_facility(facility="NSS") assert str(captured_warnings[0].message).startswith("Facility 'NSS' could not be found.") with catch_warnings(record=True) as captured_warnings: NeutronDataSelector(v_model="test", facility="HIFR") assert str(captured_warnings[0].message).startswith("Facility 'HIFR' could not be found.") with catch_warnings(record=True) as captured_warnings: NeutronDataSelector(v_model="test", facility="SNS", instrument="BL1B") assert str(captured_warnings[0].message).startswith( "Instrument 'BL1B' could not be found in 'SNS'." ) MyTrameApp() def test_parameter_bindings() -> None: class TestModel(BaseModel): v_model: List[str] = Field(default=[]) facility: str = Field(default="") instrument: str = Field(default="") experiment: str = Field(default="") allow_custom_directories: bool = Field(default=False) class MyTrameApp(ThemedApp): def __init__(self, server: Server = None) -> None: self.server = get_server(None, client_type="vue3") super().__init__(server=self.server) self.create_binding() self.create_ui() def create_binding(self) -> None: self.test_obj = TestModel() binding = TrameBinding(self.server.state) self.test_binding = binding.new_bind(self.test_obj) self.test_binding.connect("test_nds") def create_ui(self) -> None: with super().create_ui() as layout: with layout.content: NeutronDataSelector( v_model=("test_nds.v_model", ["test.txt"]), facility=("test_nds.facility", "SNS"), instrument=("test_nds.instrument", "BL-12"), experiment=("test_nds.experiment",), allow_custom_directories=("test_nds.allow_custom_directories", True), ) MyTrameApp()
tests/test_parameter_bindings.pydeleted 100644 → 0 +0 −50 Original line number Diff line number Diff line """Unit tests for DataSelector.""" from typing import List from pydantic import BaseModel, Field from trame.app import get_server from trame_server.core import Server from nova.mvvm.trame_binding import TrameBinding from nova.trame.view.components import DataSelector from nova.trame.view.theme import ThemedApp def test_parameter_bindings() -> None: class TestModel(BaseModel): v_model: List[str] = Field(default=[]) directory: str = Field(default="") extensions: List[str] = Field(default=[]) prefix: str = Field(default="") refresh_rate: int = Field(default=0) select_strategy: str = Field(default="") class MyTrameApp(ThemedApp): def __init__(self, server: Server = None) -> None: self.server = get_server(None, client_type="vue3") super().__init__(server=self.server) self.create_binding() self.create_ui() def create_binding(self) -> None: self.test_obj = TestModel() binding = TrameBinding(self.server.state) self.test_binding = binding.new_bind(self.test_obj) self.test_binding.connect("test_ds") def create_ui(self) -> None: with super().create_ui() as layout: with layout.content: DataSelector( v_model=("test_ds.v_model", ["test.txt"]), directory=("test_ds.directory", "/"), extensions=("test_ds.extensions", [".txt"]), prefix=("test_ds.prefix", "bin"), refresh_rate=("test_ds.refresh_rate", 15), select_strategy=("test_ds.select_strategy", "page"), ) MyTrameApp()