diff --git a/zppy/e3sm_diags.py b/zppy/e3sm_diags.py index 5ecb8fc0..2a611636 100644 --- a/zppy/e3sm_diags.py +++ b/zppy/e3sm_diags.py @@ -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, @@ -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}" diff --git a/zppy/utils.py b/zppy/utils.py index 8b5fb51b..e7cd2aa3 100644 --- a/zppy/utils.py +++ b/zppy/utils.py @@ -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 @@ -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 @@ -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):