Skip to content

Commit

Permalink
Implement code review suggestions by @phackstock
Browse files Browse the repository at this point in the history
  • Loading branch information
danielhuppmann committed Feb 19, 2025
1 parent be5502b commit 8b716c0
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 17 deletions.
28 changes: 12 additions & 16 deletions nomenclature/processor/data_validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,11 @@ class WarningEnum(str, Enum):
low = "low"


class DataValidationCriteria(IamcDataFilter):
class DataValidationItem(IamcDataFilter):
warning_level: WarningEnum = WarningEnum.error


class DataValidationCriteriaValue(DataValidationCriteria):
class DataValidationValue(DataValidationItem):
value: float
rtol: float = 0.0
atol: float = 0.0
Expand Down Expand Up @@ -65,7 +65,7 @@ def criteria(self):
)


class DataValidationCriteriaBounds(DataValidationCriteria):
class DataValidationBounds(DataValidationItem):
upper_bound: float | None = None
lower_bound: float | None = None

Expand All @@ -86,13 +86,16 @@ def criteria(self):
)


class DataValidationCriteriaRange(DataValidationCriteria):
class DataValidationRange(DataValidationItem):
range: list[float] = Field(..., min_length=2, max_length=2)

@model_validator(mode="after")
def check_range_is_valid(self):
if self.range[0] > self.range[1]:
raise ValueError("Validation range is invalid: " + str(self.criteria))
raise ValueError(
"Validation 'range' must be given as (lower bound, upper bound), found: "
+ str(self.range)
)
return self

@computed_field
Expand Down Expand Up @@ -121,22 +124,15 @@ def criteria(self):
)


class DataValidationCriteriaMultiple(IamcDataFilter):
validation: (
list[
DataValidationCriteriaValue
| DataValidationCriteriaBounds
| DataValidationCriteriaRange
]
| None
) = None
class DataValidationCriteria(IamcDataFilter):
validation: list[DataValidationBounds | DataValidationValue | DataValidationRange]

@model_validator(mode="after")
def check_warnings_order(self):
"""Check if warnings are set in descending order of severity."""
if self.validation != sorted(self.validation, key=lambda c: c.warning_level):
raise ValueError(
f"Validation criteria for {self.criteria} not"
f"Validation criteria for {self.criteria} not sorted"
" in descending order of severity."
)
else:
Expand All @@ -153,7 +149,7 @@ def criteria(self):
class DataValidator(Processor):
"""Processor for validating IAMC datapoints"""

criteria_items: list[DataValidationCriteriaMultiple]
criteria_items: list[DataValidationCriteria]
file: Path

@field_validator("criteria_items", mode="before")
Expand Down
2 changes: 1 addition & 1 deletion tests/test_validate_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ def test_DataValidator_validate_with_warning(file, value, simple_df, caplog):

def test_DataValidator_warning_order_fail():
"""Raises validation error if warnings for same criteria not in descending order."""
match = "Validation criteria for .* not in descending order of severity."
match = "Validation criteria for .* not sorted in descending order of severity."
with pytest.raises(ValueError, match=match):
DataValidator.from_file(
DATA_VALIDATION_TEST_DIR / "validate_warning_joined_asc.yaml"
Expand Down

0 comments on commit 8b716c0

Please sign in to comment.