Skip to content

Commit

Permalink
Explain parameter errors (#675)
Browse files Browse the repository at this point in the history
  • Loading branch information
forsyth2 authored Feb 7, 2025
1 parent 5d268f1 commit ee50ba5
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 10 deletions.
10 changes: 6 additions & 4 deletions zppy/e3sm_diags.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,9 +110,9 @@ def check_parameters_for_bash(c: Dict[str, Any]) -> None:

def check_mvm_only_parameters_for_bash(c: Dict[str, Any]) -> None:
# Check mvm-specific parameters that aren't used until e3sm_diags.bash is run.
check_parameter_defined(c, "diff_title")
check_parameter_defined(c, "ref_name")
check_parameter_defined(c, "short_ref_name")
check_parameter_defined(c, "diff_title", "mvm requires it.")
check_parameter_defined(c, "ref_name", "mvm requires it.")
check_parameter_defined(c, "short_ref_name", "mvm requires it.")

check_required_parameters(
c,
Expand Down Expand Up @@ -258,7 +258,9 @@ def add_climo_dependencies(
os.path.join(script_dir, f"climo_{climo_sub}{status_suffix}"),
)
if "diurnal_cycle" in c["sets"]:
check_parameter_defined(c, "climo_diurnal_subsection")
check_parameter_defined(
c, "climo_diurnal_subsection", "the set `diurnal_cycle` requires it."
)
dependencies.append(
os.path.join(
script_dir, f"climo_{c['climo_diurnal_subsection']}{status_suffix}"
Expand Down
25 changes: 19 additions & 6 deletions zppy/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -233,12 +233,15 @@ def check_required_parameters(
c: Dict[str, Any], sets_with_requirement: Set[str], relevant_parameter: str
) -> None:
requested_sets = set(c["sets"])
intersection = sets_with_requirement & requested_sets
if (
(sets_with_requirement & requested_sets)
intersection
and (relevant_parameter in c.keys())
and (c[relevant_parameter] == "")
):
raise ParameterNotProvidedError(relevant_parameter)
raise ParameterNotProvidedError(
f"{relevant_parameter} is required because the sets {intersection} were requested."
)


# Return all year sets from a configuration given by a list of strings
Expand Down Expand Up @@ -297,7 +300,9 @@ def define_or_guess(
# so let's make a guess for the value.
value = c[second_choice_parameter]
else:
raise ParameterNotProvidedError(first_choice_parameter)
raise ParameterNotProvidedError(
f"{first_choice_parameter} was not provided, and guessing is turned off. Turn on guessing by setting {guess_type_parameter} to True."
)
return value


Expand All @@ -315,12 +320,20 @@ def define_or_guess2(
if c[guess_type_parameter]:
c[parameter] = backup_option
else:
raise ParameterNotProvidedError(parameter)
raise ParameterNotProvidedError(
f"{parameter} was not provided, and guessing is turned off. Turn on guessing by setting {guess_type_parameter} to True."
)


def check_parameter_defined(c: Dict[str, Any], relevant_parameter: str) -> None:
def check_parameter_defined(
c: Dict[str, Any], relevant_parameter: str, explanation: str = ""
) -> None:
if (relevant_parameter not in c.keys()) or (c[relevant_parameter] == ""):
raise ParameterNotProvidedError(relevant_parameter)
if explanation:
message = f"{relevant_parameter} is needed because {explanation}"
else:
message = f"{relevant_parameter} is not defined."
raise ParameterNotProvidedError(message)


def get_file_names(script_dir: str, prefix: str):
Expand Down

0 comments on commit ee50ba5

Please sign in to comment.