Skip to content

Commit

Permalink
Merge pull request #86 from neutrons/errors
Browse files Browse the repository at this point in the history
Errors
  • Loading branch information
rosswhitfield authored May 18, 2023
2 parents 27fd82e + 9f2d1c0 commit bf05248
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 40 deletions.
9 changes: 8 additions & 1 deletion src/shiver/models/convert_dgs_to_single_mde.py
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,14 @@ def PyExec(self): # pylint: disable=too-many-branches
run_obj = data.getRun()
# check if monitor is necessary and get Ei,T0
if inst_name in ["HYSPEC", "CNCS"]:
Ei = Ei_supplied if Ei_supplied else run_obj["EnergyRequest"].getStatistics().mean
Ei = None
if Ei_supplied:
Ei = Ei_supplied
elif "EnergyRequest" in run_obj:
Ei = run_obj["EnergyRequest"].getStatistics().mean
else:
self.log().error("EnergyRequest is not defined")
raise ValueError("EnergyRequest is not defined")
T0 = T0_supplied if (T0_supplied is not None) else GetEi(data).Tzero
else:
if (Ei_supplied is not None) and (T0_supplied is not None):
Expand Down
13 changes: 8 additions & 5 deletions src/shiver/models/generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def generate_mde(self, config_dict: dict):

# disable the Generate button to prevent multiple clicks
if self.generate_mde_finish_callback:
self.generate_mde_finish_callback()
self.generate_mde_finish_callback(False)

# remove output workspace if it exists in memory
output_workspace = config_dict.get("mde_name", "")
Expand Down Expand Up @@ -161,7 +161,7 @@ def generate_mde(self, config_dict: dict):
alg.setProperty("UBParameters", ub_parameters)
alg.setProperty("OutputWorkspace", output_workspace)
alg.executeAsync()
except RuntimeError as err:
except (RuntimeError, ValueError) as err:
# NOTE: this error is usually related to incorrect input that triggers
# error during alg start-up, execution error will be captured
# by the obs handlers.
Expand Down Expand Up @@ -190,8 +190,11 @@ def finish_generate_mde(self, obs, error=False, msg=""):
self.workspace_name = None
self.output_dir = None
self.config_dict = None
# enable button
if self.generate_mde_finish_callback:
self.generate_mde_finish_callback()
self.generate_mde_finish_callback(True)
if self.error_callback:
self.error_callback(msg=err_msg)
else:
logger.information("GenerateDGSMDE finished")
# attach config_dict to the workspace
Expand Down Expand Up @@ -262,8 +265,8 @@ def finish_save_md(self, obs, error=False, msg=""):
self.output_dir = None

self.algorithm_observer.remove(obs)

self.generate_mde_finish_callback()
# enable button
self.generate_mde_finish_callback(True)


class GenerateMDEObserver(AlgorithmObserver):
Expand Down
2 changes: 1 addition & 1 deletion src/shiver/models/histogram.py
Original file line number Diff line number Diff line change
Expand Up @@ -372,7 +372,7 @@ def do_make_slice(self, config: dict):
alg.setProperty("Smoothing", config.get("Smoothing", ""))
alg.setProperty("OutputWorkspace", config.get("OutputWorkspace"))
alg.executeAsync()
except RuntimeError as err:
except (RuntimeError, ValueError) as err:
logger.error(str(err))
if self.error_callback:
self.error_callback(str(err))
Expand Down
40 changes: 26 additions & 14 deletions src/shiver/views/generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,17 +88,25 @@ def __init__(self, parent=None):

self.inhibit_update = False

# check the state of the required fields
# pass the save_btn in mde_type widget to allow for button activations/deactivations
# check the state of the required fields for each button
# to allow for button activations/deactivations of save_btn and generate_btn
# based on the fields states
self.field_errors = []
self.field_errors = {self.buttons.save_btn: [], self.buttons.generate_btn: []}
# mandatory fields for the two available buttons
self.field_btns = {
self.mde_type_widget.output_dir: [self.buttons.save_btn, self.buttons.generate_btn],
self.mde_type_widget.mde_name: [self.buttons.save_btn, self.buttons.generate_btn],
self.raw_data_widget.files: [self.buttons.save_btn, self.buttons.generate_btn],
self.reduction_parameters.ei_input: [self.buttons.save_btn],
self.reduction_parameters.t0_input: [self.buttons.save_btn],
}
self.mde_type_widget.check_output_dir()
self.mde_type_widget.check_mde_name()
self.raw_data_widget.check_file_input()

def generate_mde_finish_callback(self):
def generate_mde_finish_callback(self, activate):
"""Toggle the generate button disabled state."""
if self.isEnabled():
if not activate:
self.setDisabled(True)
else:
self.setEnabled(True)
Expand Down Expand Up @@ -205,17 +213,21 @@ def _show_error_message(self, msg):
error.exec_()

def set_field_invalid_state(self, item):
"""include the item in the field_error list and disable the corresponding button"""
if item not in self.field_errors:
self.field_errors.append(item)
self.buttons.save_btn.setEnabled(False)
"""include the item in the field_error list and disable the corresponding button/s"""
buttons = self.field_btns[item]
for btn in buttons:
if item not in self.field_errors[btn]:
self.field_errors[btn].append(item)
btn.setEnabled(False)

def set_field_valid_state(self, item):
"""remove the item from the field_error list and enable the corresponding button"""
if item in self.field_errors:
self.field_errors.remove(item)
if len(self.field_errors) == 0:
self.buttons.save_btn.setEnabled(True)
"""remove the item from the field_error list and enable the corresponding button/s"""
buttons = self.field_btns[item]
for btn in buttons:
if item in self.field_errors[btn]:
self.field_errors[btn].remove(item)
if len(self.field_errors[btn]) == 0:
btn.setEnabled(True)

def get_save_configuration_filepath(
self,
Expand Down
50 changes: 31 additions & 19 deletions tests/views/test_generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,8 @@ def error_callback(msg):
mde_type_widget.connect_error_callback(error_callback)

# all three required fields are empty
assert len(generate.field_errors) == 3
assert len(generate.field_errors[generate.buttons.save_btn]) == 3
assert len(generate.field_errors[generate.buttons.generate_btn]) == 3

# set files
directory = os.path.realpath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../data/raw"))
Expand Down Expand Up @@ -69,33 +70,37 @@ def error_callback(msg):
assert mde_type_widget.mde_name.text() == "test"
assert mde_type_widget.output_dir.text() == "/tmp/test"
assert mde_type_widget.mde_type_background_integrated.isChecked() is True
assert len(generate.field_errors) == 0
assert len(generate.field_errors[generate.buttons.save_btn]) == 0
assert len(generate.field_errors[generate.buttons.generate_btn]) == 0

#
ref_dict["mde_type"] = "Data"
mde_type_widget.populate_from_dict(ref_dict)
assert mde_type_widget.mde_type_data.isChecked() is True
assert len(generate.field_errors) == 0
assert len(generate.field_errors[generate.buttons.save_btn]) == 0
assert len(generate.field_errors[generate.buttons.generate_btn]) == 0
#
ref_dict["mde_type"] = "Background (minimized by angle and energy)"
mde_type_widget.populate_from_dict(ref_dict)
assert mde_type_widget.mde_type_background_minimized.isChecked() is True
assert len(generate.field_errors) == 0
assert len(generate.field_errors[generate.buttons.save_btn]) == 0
assert len(generate.field_errors[generate.buttons.generate_btn]) == 0

# check error_1: invalid mde name
mde_type_widget.re_init_widget()
ref_dict["mde_name"] = "test?"
mde_type_widget.populate_from_dict(ref_dict)
assert not mde_type_widget.as_dict()
assert errors_list[-1] == "Invalid MDE name found in history."
assert len(generate.field_errors) == 1
assert len(generate.field_errors[generate.buttons.save_btn]) == 1
assert len(generate.field_errors[generate.buttons.generate_btn]) == 1

# check error_2: empty output dir
mde_type_widget.re_init_widget()
mde_type_widget.mde_name.setText("test")
mde_type_widget.output_dir.setText(" ")
assert not mde_type_widget.as_dict()
assert len(generate.field_errors) == 1
assert len(generate.field_errors[generate.buttons.save_btn]) == 1

# check error_3: invalid output dir
mde_type_widget.re_init_widget()
Expand All @@ -104,13 +109,13 @@ def error_callback(msg):
mde_type_widget.populate_from_dict(ref_dict)
assert not mde_type_widget.as_dict()
assert errors_list[-1] == "Invalid output directory found in history."
assert len(generate.field_errors) == 2
assert len(generate.field_errors[generate.buttons.save_btn]) == 2

# check error_4: invalid dict used to populate UI
mde_type_widget.re_init_widget()
mde_type_widget.populate_from_dict({"mde_name": "test?"})
assert errors_list[-1] == "Invalid MDE name found in history."
assert len(generate.field_errors) == 2
assert len(generate.field_errors[generate.buttons.save_btn]) == 2

#
mde_type_widget.re_init_widget()
Expand Down Expand Up @@ -142,31 +147,34 @@ def test_generate_widget_colors_invalid(qtbot):
color_search = re.compile("border-color: (.*);")

# all three required fields are empty
assert len(generate.field_errors) == 3

assert len(generate.field_errors[generate.buttons.save_btn]) == 3
assert len(generate.field_errors[generate.buttons.generate_btn]) == 3
# check mde_name border
qtbot.keyClicks(mde_type_widget.mde_name, "")

css_style_mde_name = mde_type_widget.mde_name.styleSheet()
color = color_search.search(css_style_mde_name).group(1)
assert color == "red"
assert len(generate.field_errors) == 3
assert len(generate.field_errors[generate.buttons.save_btn]) == 3
assert len(generate.field_errors[generate.buttons.generate_btn]) == 3

qtbot.keyClicks(mde_type_widget.output_dir, "/tmp/test?")
# check output_dir border
css_style_output_dir = mde_type_widget.output_dir.styleSheet()
color = color_search.search(css_style_output_dir).group(1)
assert color == "red"
assert len(generate.field_errors) == 3
assert len(generate.field_errors[generate.buttons.save_btn]) == 3

# check files border
css_style_files = raw_data_widget.files.styleSheet()
color = color_search.search(css_style_files).group(1)
assert color == "red"
assert len(generate.field_errors) == 3
assert len(generate.field_errors[generate.buttons.save_btn]) == 3
assert len(generate.field_errors[generate.buttons.generate_btn]) == 3

# assert button is deactivated
# assert buttons are deactivated
assert generate.buttons.save_btn.isEnabled() is False
assert generate.buttons.generate_btn.isEnabled() is False


def test_generate_widget_colors_valid(qtbot):
Expand All @@ -177,19 +185,20 @@ def test_generate_widget_colors_valid(qtbot):
qtbot.addWidget(generate)
generate.show()

assert len(generate.field_errors) == 3
assert len(generate.field_errors[generate.buttons.save_btn]) == 3
assert len(generate.field_errors[generate.buttons.generate_btn]) == 3

# set mde_name
qtbot.keyClicks(mde_type_widget.mde_name, "mde_test_2")
css_style_mde_name = mde_type_widget.mde_name.styleSheet()
assert css_style_mde_name == ""
assert len(generate.field_errors) == 2
assert len(generate.field_errors[generate.buttons.save_btn]) == 2

# set output_dir
qtbot.keyClicks(mde_type_widget.output_dir, "/tmp/")
css_style_output_dir = mde_type_widget.output_dir.styleSheet()
assert css_style_output_dir == ""
assert len(generate.field_errors) == 1
assert len(generate.field_errors[generate.buttons.save_btn]) == 1

# set files
assert raw_data_widget.files.count() == 0
Expand All @@ -203,7 +212,10 @@ def test_generate_widget_colors_valid(qtbot):
qtbot.wait(100)
css_style_files = raw_data_widget.files.styleSheet()
assert css_style_files == ""
assert len(generate.field_errors) == 0
# assert button is activated
assert len(generate.field_errors[generate.buttons.save_btn]) == 0
assert len(generate.field_errors[generate.buttons.generate_btn]) == 0

# assert buttons are activated
assert generate.buttons.save_btn.isEnabled() is True
assert generate.buttons.generate_btn.isEnabled() is True
qtbot.mouseClick(generate.buttons.save_btn, QtCore.Qt.LeftButton)

1 comment on commit bf05248

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GitLab pipeline for shiver-dev has been submitted for this commit: "https://code.ornl.gov/sns-hfir-scse/deployments/conda-legacy-deploy/-/pipelines/382966"

Please sign in to comment.