From 8b81968fa6efab1205d352b66b6a3dd5c5f36a8e Mon Sep 17 00:00:00 2001 From: David Almeida Date: Tue, 22 Oct 2024 17:27:14 +0200 Subject: [PATCH 1/3] Add CLI command to validate scenario data file from definitions --- nomenclature/cli.py | 26 +++++++++++++++++++ .../definitions/region/regions.yaml | 4 +++ .../definitions/variable/variables.yaml | 3 +++ tests/test_cli.py | 25 ++++++++++++++++++ 4 files changed, 58 insertions(+) create mode 100644 tests/data/cli/validate_scenarios/definitions/region/regions.yaml create mode 100644 tests/data/cli/validate_scenarios/definitions/variable/variables.yaml diff --git a/nomenclature/cli.py b/nomenclature/cli.py index 33cdafc1..964b36e5 100644 --- a/nomenclature/cli.py +++ b/nomenclature/cli.py @@ -277,3 +277,29 @@ def cli_run_workflow( df = getattr(workflow, workflow_function)(IamDataFrame(input_file)) if output_file is not None: df.to_excel(output_file) + + +@cli.command("validate-scenarios") +@click.argument("input_file", type=click.Path(exists=True, path_type=Path)) +@click.option( + "--definitions", + help="Optional name for definitions folder", + type=str, + default="definitions", +) +def cli_validate_scenarios(input_file: Path, definitions: Path): + """Run a given input file through a workflow function defined in a workflow.py + + Parameters + ---------- + input_file : Path + Input data file, must be IAMC format, .xlsx or .csv + definitions : str + Definitions folder inside workflow_directory, by default "definitions" + + Raises + ------ + ValueError + If input_file validation fails against specified codelist(s). + """ + DataStructureDefinition(definitions).validate(IamDataFrame(input_file)) diff --git a/tests/data/cli/validate_scenarios/definitions/region/regions.yaml b/tests/data/cli/validate_scenarios/definitions/region/regions.yaml new file mode 100644 index 00000000..7f9b3ac6 --- /dev/null +++ b/tests/data/cli/validate_scenarios/definitions/region/regions.yaml @@ -0,0 +1,4 @@ +- common: + - World +- country: + - Austria diff --git a/tests/data/cli/validate_scenarios/definitions/variable/variables.yaml b/tests/data/cli/validate_scenarios/definitions/variable/variables.yaml new file mode 100644 index 00000000..7a367a2b --- /dev/null +++ b/tests/data/cli/validate_scenarios/definitions/variable/variables.yaml @@ -0,0 +1,3 @@ +- Primary Energy: + definition: Total primary energy consumption + unit: EJ/yr diff --git a/tests/test_cli.py b/tests/test_cli.py index dd1b3422..a5a1d469 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -420,3 +420,28 @@ def test_cli_run_workflow(tmp_path, simple_df): ) assert_iamframe_equal(simple_df, IamDataFrame(tmp_path / "output.xlsx")) + + +@pytest.mark.parametrize( + "status, unit, exit_code", [("valid", "EJ/yr", 0), ("invalid", "EJ", 1)] +) +def test_cli_valid_scenarios(status, unit, exit_code, tmp_path): + """Check that CLI validates an IAMC dataset according to defined codelist.""" + IamDataFrame( + pd.DataFrame( + [ + ["m_a", "s_a", "World", "Primary Energy", unit, 1, 2], + ], + columns=IAMC_IDX + [2005, 2010], + ) + ).to_excel(tmp_path / f"{status}_data.xlsx") + result_valid = runner.invoke( + cli, + [ + "validate-scenarios", + str(tmp_path / f"{status}_data.xlsx"), + "--definitions", + str(MODULE_TEST_DATA_DIR / "validate_scenarios" / "definitions"), + ], + ) + assert result_valid.exit_code == exit_code From c875598ee3fa6577f974e0219b3a3952b29cabd5 Mon Sep 17 00:00:00 2001 From: David Almeida Date: Wed, 23 Oct 2024 08:43:16 +0200 Subject: [PATCH 2/3] Fix docstring and typing --- nomenclature/cli.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/nomenclature/cli.py b/nomenclature/cli.py index 964b36e5..36b69fea 100644 --- a/nomenclature/cli.py +++ b/nomenclature/cli.py @@ -284,18 +284,19 @@ def cli_run_workflow( @click.option( "--definitions", help="Optional name for definitions folder", - type=str, + type=click.Path(exists=True, path_type=Path), default="definitions", ) def cli_validate_scenarios(input_file: Path, definitions: Path): - """Run a given input file through a workflow function defined in a workflow.py + """Run a given input file through a DataStructureDefinition validation, + checking it against defined codelist(s) Parameters ---------- input_file : Path Input data file, must be IAMC format, .xlsx or .csv - definitions : str - Definitions folder inside workflow_directory, by default "definitions" + definitions : Path + Definitions folder with codelists, by default "definitions" Raises ------ From 7040bab7faa0e2efa498267856b3302ccb009b0d Mon Sep 17 00:00:00 2001 From: David Almeida Date: Wed, 23 Oct 2024 09:52:19 +0200 Subject: [PATCH 3/3] Shorten docstring and reuse existing test folder --- nomenclature/cli.py | 3 +-- .../cli/validate_scenarios/definitions/region/regions.yaml | 4 ---- .../validate_scenarios/definitions/variable/variables.yaml | 3 --- tests/test_cli.py | 6 +++++- 4 files changed, 6 insertions(+), 10 deletions(-) delete mode 100644 tests/data/cli/validate_scenarios/definitions/region/regions.yaml delete mode 100644 tests/data/cli/validate_scenarios/definitions/variable/variables.yaml diff --git a/nomenclature/cli.py b/nomenclature/cli.py index 36b69fea..18ef895d 100644 --- a/nomenclature/cli.py +++ b/nomenclature/cli.py @@ -288,8 +288,7 @@ def cli_run_workflow( default="definitions", ) def cli_validate_scenarios(input_file: Path, definitions: Path): - """Run a given input file through a DataStructureDefinition validation, - checking it against defined codelist(s) + """Validate a scenario file against the codelists of a project Parameters ---------- diff --git a/tests/data/cli/validate_scenarios/definitions/region/regions.yaml b/tests/data/cli/validate_scenarios/definitions/region/regions.yaml deleted file mode 100644 index 7f9b3ac6..00000000 --- a/tests/data/cli/validate_scenarios/definitions/region/regions.yaml +++ /dev/null @@ -1,4 +0,0 @@ -- common: - - World -- country: - - Austria diff --git a/tests/data/cli/validate_scenarios/definitions/variable/variables.yaml b/tests/data/cli/validate_scenarios/definitions/variable/variables.yaml deleted file mode 100644 index 7a367a2b..00000000 --- a/tests/data/cli/validate_scenarios/definitions/variable/variables.yaml +++ /dev/null @@ -1,3 +0,0 @@ -- Primary Energy: - definition: Total primary energy consumption - unit: EJ/yr diff --git a/tests/test_cli.py b/tests/test_cli.py index a5a1d469..9eaee1ff 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -441,7 +441,11 @@ def test_cli_valid_scenarios(status, unit, exit_code, tmp_path): "validate-scenarios", str(tmp_path / f"{status}_data.xlsx"), "--definitions", - str(MODULE_TEST_DATA_DIR / "validate_scenarios" / "definitions"), + str( + MODULE_TEST_DATA_DIR + / "structure_validation_no_mappings" + / "definitions" + ), ], ) assert result_valid.exit_code == exit_code