Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Explain parameter errors #675

Merged
merged 1 commit into from
Feb 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading