Skip to content
Draft
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
21 changes: 21 additions & 0 deletions nomenclature/processor/data_validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -388,3 +388,24 @@ def validate_with_definition(self, dsd: DataStructureDefinition) -> None:
f"Error in DataValidator (file {get_relative_path(self.file)})",
errors,
)

@property
def input_data(self):
return merge_criteria_items_filter_args(self.criteria_items)


def merge_criteria_items_filter_args(list_of_items: list[DataValidationItem]) -> dict:
"""Concatenate filter-arguments"""
merged_dict = {}
for dct in list_of_items:
for key, value in dct.filter_args.items():
if key in merged_dict:
merged_dict[key].extend(value)
else:
merged_dict[key] = value

# drop duplicates
for key, value in merged_dict.items():
merged_dict[key] = list(set(merged_dict[key]))

return merged_dict
6 changes: 5 additions & 1 deletion nomenclature/processor/processor.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,16 @@


class Processor(BaseModel, abc.ABC):
input_data: Annotated[dict[str, list[str]] | None, Field(frozen=True)] = None
# input_data: Annotated[dict[str, list[str]] | None, Field(frozen=True)] = None
input_meta: Annotated[list[str] | None, Field(frozen=True)] = None
output_data: Annotated[dict[str, list[str]] | None, Field(frozen=True)] = None
output_meta: Annotated[list[str] | None, Field(frozen=True)] = None
fail_ok: bool = False

@property
def input_meta(self) -> Annotated[list[str] | None, Field(frozen=True)]:

Check failure on line 16 in nomenclature/processor/processor.py

View workflow job for this annotation

GitHub Actions / ruff

ruff (F811)

nomenclature/processor/processor.py:16:9: F811 Redefinition of unused `input_meta` from line 10: `input_meta` redefined here nomenclature/processor/processor.py:10:5: previous definition of `input_meta` here help: Remove definition: `input_meta`
return

@abc.abstractmethod
def apply(self, df: IamDataFrame) -> IamDataFrame:
raise NotImplementedError
3 changes: 1 addition & 2 deletions tests/test_aggregator.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,7 @@ def test_aggregator_from_file():
"rename": [
{"name": "Resource|Extraction|Petrol", "rename": "Resource|Extraction|Oil"}
],
"input_data": None,
"input_meta": None,
# "input_data": None,
"output_data": None,
"output_meta": None,
"fail_ok": False,
Expand Down
14 changes: 7 additions & 7 deletions tests/test_processor.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from pydantic import ValidationError

Check failure on line 1 in tests/test_processor.py

View workflow job for this annotation

GitHub Actions / ruff

ruff (F401)

tests/test_processor.py:1:22: F401 `pydantic.ValidationError` imported but unused help: Remove unused import: `pydantic.ValidationError`
import pytest

Check failure on line 2 in tests/test_processor.py

View workflow job for this annotation

GitHub Actions / ruff

ruff (F401)

tests/test_processor.py:2:8: F401 `pytest` imported but unused help: Remove unused import: `pytest`
from pyam import IamDataFrame

Expand All @@ -10,22 +10,22 @@
def apply(self, df: IamDataFrame) -> IamDataFrame:
return df

input_data = {"variable": ["Emissions|CO2"], "region": ["World"]}
# input_data = {"variable": ["Emissions|CO2"], "region": ["World"]}
output_meta = ["Emissions Diagnostics|Year of Net Zero|CO2"]
processor = ProcessorSubclass(
input_data=input_data,
# input_data=input_data,
output_meta=output_meta,
fail_ok=True,
)

assert processor.input_data == input_data
# assert processor.input_data == input_data
assert processor.input_meta is None
assert processor.output_data is None
assert processor.output_meta == output_meta

# check that frozen fields cannot be modified after instantiation
with pytest.raises(ValidationError, match="Field is frozen"):
processor.input_data = {"variable": ["Emissions|Kyoto Gases"]}
with pytest.raises(ValidationError, match="Field is frozen"):
processor.input_meta = ["Emissions Diagnostics|Cumulative CO2 [2020-2100"]
# with pytest.raises(ValidationError, match="Field is frozen"):
# processor.input_data = {"variable": ["Emissions|Kyoto Gases"]}
# with pytest.raises(ValidationError, match="Field is frozen"):
# processor.input_meta = ["Emissions Diagnostics|Cumulative CO2 [2020-2100"]
assert processor.fail_ok is True
6 changes: 6 additions & 0 deletions tests/test_validate_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ def test_DataValidator_simple_from_file():
dsd = DataStructureDefinition(TEST_DATA_DIR / "validation" / "definitions")
assert obs.validate_with_definition(dsd) is None

assert obs.input_data == {"variable": ["Final Energy"], "year": [2010]}


def test_DataValidator_structured_from_file():
exp = DataValidator(
Expand Down Expand Up @@ -98,6 +100,10 @@ def test_DataValidator_from_codelist():
)
assert variable_codelist.data_validator == exp

assert variable_codelist.data_validator.input_data == {
"variable": ["Final Energy", "Final Energy|Electricity [Share]"]
}


@pytest.mark.parametrize(
"name, match",
Expand Down
Loading