Skip to content

Commit

Permalink
[MAINTENANCE] Add suite_name to ExpectationSuiteValidationResult (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
cdkini committed Mar 29, 2024
1 parent eff37b8 commit 453af44
Show file tree
Hide file tree
Showing 25 changed files with 104 additions and 36 deletions.
28 changes: 13 additions & 15 deletions great_expectations/core/expectation_validation_result.py
Original file line number Diff line number Diff line change
Expand Up @@ -503,13 +503,15 @@ class ExpectationSuiteValidationResult(SerializableDictDot):
evaluation_parameters: Dict of Evaluation Parameters used to produce these results, or None.
statistics: Dict of values describing the results.
meta: Instance of ExpectationSuiteValidationResult, a Dict of meta values, or None.
batch_id: A unique identifier for the batch of data that was validated.
result_url: A URL where the results are stored.
""" # noqa: E501

def __init__( # noqa: PLR0913
self,
success: Optional[bool] = None,
results: Optional[list] = None,
success: bool,
results: list[ExpectationValidationResult],
suite_name: str,
evaluation_parameters: Optional[dict] = None,
statistics: Optional[dict] = None,
meta: Optional[ExpectationSuiteValidationResult | dict] = None,
Expand All @@ -518,21 +520,16 @@ def __init__( # noqa: PLR0913
id: Optional[str] = None,
) -> None:
self.success = success
if results is None:
results = []
self.results = results
if evaluation_parameters is None:
evaluation_parameters = {}
self.evaluation_parameters = evaluation_parameters
if statistics is None:
statistics = {}
self.statistics = statistics
if meta is None:
meta = {}
self.suite_name = suite_name
self.evaluation_parameters = evaluation_parameters or {}
self.statistics = statistics or {}
meta = meta or {}
ensure_json_serializable(meta) # We require meta information to be serializable.
self.meta = meta
self.batch_id = batch_id
self.result_url = result_url
self.id = id
self._metrics: dict = {}

def __eq__(self, other):
Expand Down Expand Up @@ -613,7 +610,7 @@ def get_failed_validation_results(
) -> ExpectationSuiteValidationResult:
validation_results = [result for result in self.results if not result.success]

successful_expectations = sum(exp.success for exp in validation_results)
successful_expectations = sum(exp.success or False for exp in validation_results)
evaluated_expectations = len(validation_results)
unsuccessful_expectations = evaluated_expectations - successful_expectations
success = successful_expectations == evaluated_expectations
Expand All @@ -632,6 +629,7 @@ def get_failed_validation_results(
return ExpectationSuiteValidationResult(
success=success,
results=validation_results,
suite_name=self.suite_name,
evaluation_parameters=self.evaluation_parameters,
statistics=statistics,
meta=self.meta,
Expand All @@ -654,11 +652,11 @@ def describe(self) -> str:
class ExpectationSuiteValidationResultSchema(Schema):
success = fields.Bool()
results = fields.List(fields.Nested(ExpectationValidationResultSchema))
suite_name = fields.String(required=True, allow_none=False)
evaluation_parameters = fields.Dict()
statistics = fields.Dict()
meta = fields.Dict(allow_none=True)
id = fields.UUID(required=False, allow_none=True)
checkpoint_name = fields.String(required=False, allow_none=True)

# noinspection PyUnusedLocal
@pre_dump
Expand Down
1 change: 1 addition & 0 deletions great_expectations/validator/v1_validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ def validate_expectation_suite(
return ExpectationSuiteValidationResult(
results=results,
success=statistics.success,
suite_name=expectation_suite.name,
statistics={
"evaluated_expectations": statistics.evaluated_expectations,
"successful_expectations": statistics.successful_expectations,
Expand Down
8 changes: 7 additions & 1 deletion great_expectations/validator/validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -1066,8 +1066,13 @@ def discard_failing_expectations(self) -> None:
res = self.validate(only_return_failures=True).results # type: ignore[union-attr] # ExpectationValidationResult has no `.results` attr
if any(res):
for item in res:
config = item.expectation_config
if not config:
raise ValueError(
"ExpectationValidationResult does not have an expectation_config"
)
self.remove_expectation(
expectation_configuration=item.expectation_config,
expectation_configuration=config,
match_type="runtime",
)
warnings.warn(f"Removed {len(res)} expectations that were 'False'")
Expand Down Expand Up @@ -1417,6 +1422,7 @@ def validate( # noqa: C901, PLR0912, PLR0913, PLR0915
result = ExpectationSuiteValidationResult(
results=results,
success=statistics.success,
suite_name=expectation_suite_name,
statistics={
"evaluated_expectations": statistics.evaluated_expectations,
"successful_expectations": statistics.successful_expectations,
Expand Down
2 changes: 2 additions & 0 deletions tests/actions/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ def validation_result_suite():
return ExpectationSuiteValidationResult(
results=[],
success=True,
suite_name="empty_suite",
statistics={
"evaluated_expectations": 0,
"successful_expectations": 0,
Expand Down Expand Up @@ -112,6 +113,7 @@ def validation_result_suite_with_ge_cloud_id(validation_result_suite_ge_cloud_id
return ExpectationSuiteValidationResult(
results=[],
success=True,
suite_name="empty_suite",
statistics={
"evaluated_expectations": 0,
"successful_expectations": 0,
Expand Down
8 changes: 6 additions & 2 deletions tests/actions/test_core_actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,9 @@ class Object:
run_id=RunIdentifier(run_name="prod_20190801"),
batch_identifier="1234",
),
validation_result_suite=ExpectationSuiteValidationResult(success=False, results=[]),
validation_result_suite=ExpectationSuiteValidationResult(
success=False, results=[], suite_name="empty_suite"
),
data_asset=None,
)

Expand All @@ -118,7 +120,7 @@ class Object:
run_id=expected_run_id,
batch_identifier="1234",
)
) == ExpectationSuiteValidationResult(success=False, results=[])
) == ExpectationSuiteValidationResult(success=False, results=[], suite_name="empty_suite")


@pytest.mark.big
Expand Down Expand Up @@ -217,6 +219,7 @@ def test_SlackNotificationAction(
validation_result_suite=ExpectationSuiteValidationResult(
success=False,
results=[],
suite_name="empty_suite",
statistics={
"successful_expectations": [],
"evaluated_expectations": [],
Expand All @@ -239,6 +242,7 @@ def test_SlackNotificationAction(
validation_result_suite=ExpectationSuiteValidationResult(
success=True,
results=[],
suite_name="empty_suite",
statistics={
"successful_expectations": [],
"evaluated_expectations": [],
Expand Down
1 change: 1 addition & 0 deletions tests/actions/test_sns_action.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ def test_send_sns_notification(sns, aws_credentials):
"missing_count": None,
"missing_percent": None,
},
"suite_name": "empty_suite",
}
result = ExpectationSuiteValidationResult(**results)
topic = "test"
Expand Down
1 change: 1 addition & 0 deletions tests/checkpoint/test_v1_checkpoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -403,6 +403,7 @@ def validation_definition(
},
),
],
suite_name=self.suite_name,
statistics={
"evaluated_expectations": 1,
"successful_expectations": 1,
Expand Down
1 change: 1 addition & 0 deletions tests/core/test_expectation_validation_result.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ def test_expectation_suite_validation_result_returns_expected_shape(
"unsuccessful_expectations": 0,
"success_percent": 100.0,
},
suite_name="empty_suite",
results=[
ExpectationValidationResult(
**{
Expand Down
1 change: 1 addition & 0 deletions tests/core/test_validation_definition.py
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ def test_returns_expected_data(
assert output == ExpectationSuiteValidationResult(
results=graph_validate_results,
success=True,
suite_name="empty_suite",
statistics={
"evaluated_expectations": 1,
"successful_expectations": 1,
Expand Down
4 changes: 3 additions & 1 deletion tests/data_context/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -683,7 +683,9 @@ def checkpoint_result(checkpoint_config: dict) -> CheckpointResult:
run_id=RunIdentifier(run_time=timestamp),
batch_identifier="default_pandas_datasource-#ephemeral_pandas_asset",
): {
"validation_result": ExpectationSuiteValidationResult(),
"validation_result": ExpectationSuiteValidationResult(
success=True, results=[], suite_name="my_suite"
),
"actions_results": {"my_action": {"class": "StoreValidationResultAction"}},
}
}
Expand Down
4 changes: 4 additions & 0 deletions tests/data_context/migrator/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ def get(self, key):
# Note: Key is unused
return ExpectationSuiteValidationResult(
success=True,
results=[],
suite_name="empty_suite",
)


Expand Down Expand Up @@ -262,8 +264,10 @@ def serialized_configuration_bundle() -> dict:
"evaluation_parameters": {},
"meta": {},
"results": [],
"suite_name": "empty_suite",
"statistics": {},
"success": True,
"id": None,
}
},
}
Expand Down
2 changes: 2 additions & 0 deletions tests/data_context/store/test_evaluation_parameter_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ def test_evaluation_parameter_store_methods(
)
],
success=True,
suite_name="source_patient_data.default",
)

data_context_parameterized_expectation_suite.store_evaluation_parameters(
Expand Down Expand Up @@ -162,6 +163,7 @@ def test_evaluation_parameter_store_methods(
)
],
success=True,
suite_name="source_diabetes_data.default",
)

data_context_parameterized_expectation_suite.store_evaluation_parameters(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ def test_evaluation_parameter_store_methods(
)
],
success=True,
suite_name="source_patient_data.default",
)

data_context_parameterized_expectation_suite_no_checkpoint_store.store_evaluation_parameters(
Expand Down Expand Up @@ -153,6 +154,7 @@ def test_evaluation_parameter_store_methods(
)
],
success=True,
suite_name="source_diabetes_data.default",
)

data_context_parameterized_expectation_suite_no_checkpoint_store.store_evaluation_parameters(
Expand Down
56 changes: 40 additions & 16 deletions tests/data_context/store/test_validations_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,12 @@ def test_ValidationsStore_with_TupleS3StoreBackend(aws_credentials):
run_id="20191007T151224.1234Z_prod_100",
batch_identifier="batch_id",
)
my_store.set(ns_1, ExpectationSuiteValidationResult(success=True))
my_store.set(
ns_1,
ExpectationSuiteValidationResult(success=True, results=[], suite_name="asset.quarantine"),
)
assert my_store.get(ns_1) == ExpectationSuiteValidationResult(
success=True, statistics={}, results=[]
success=True, statistics={}, results=[], suite_name="asset.quarantine"
)

ns_2 = ValidationResultIdentifier(
Expand All @@ -61,9 +64,12 @@ def test_ValidationsStore_with_TupleS3StoreBackend(aws_credentials):
batch_identifier="batch_id",
)

my_store.set(ns_2, ExpectationSuiteValidationResult(success=False))
my_store.set(
ns_2,
ExpectationSuiteValidationResult(success=False, results=[], suite_name="asset.quarantine"),
)
assert my_store.get(ns_2) == ExpectationSuiteValidationResult(
success=False, statistics={}, results=[]
success=False, statistics={}, results=[], suite_name="asset.quarantine"
)

# Verify that internals are working as expected, including the default filepath
Expand Down Expand Up @@ -118,9 +124,12 @@ def test_ValidationsStore_with_InMemoryStoreBackend():
"prod-100",
)
)
my_store.set(ns_1, ExpectationSuiteValidationResult(success=True))
my_store.set(
ns_1,
ExpectationSuiteValidationResult(success=True, results=[], suite_name="a.b.c.quarantine"),
)
assert my_store.get(ns_1) == ExpectationSuiteValidationResult(
success=True, statistics={}, results=[]
success=True, statistics={}, results=[], suite_name="a.b.c.quarantine"
)

ns_2 = ValidationResultIdentifier.from_tuple(
Expand All @@ -133,9 +142,12 @@ def test_ValidationsStore_with_InMemoryStoreBackend():
"prod-200",
)
)
my_store.set(ns_2, ExpectationSuiteValidationResult(success=False))
my_store.set(
ns_2,
ExpectationSuiteValidationResult(success=False, results=[], suite_name="a.b.c.quarantine"),
)
assert my_store.get(ns_2) == ExpectationSuiteValidationResult(
success=False, statistics={}, results=[]
success=False, statistics={}, results=[], suite_name="a.b.c.quarantine"
)
assert set(my_store.list_keys()) == {
ns_1,
Expand Down Expand Up @@ -181,9 +193,12 @@ def test_ValidationsStore_with_TupleFileSystemStoreBackend(tmp_path_factory):
run_id="prod-100",
batch_identifier="batch_id",
)
my_store.set(ns_1, ExpectationSuiteValidationResult(success=True))
my_store.set(
ns_1,
ExpectationSuiteValidationResult(success=True, results=[], suite_name="asset.quarantine"),
)
assert my_store.get(ns_1) == ExpectationSuiteValidationResult(
success=True, statistics={}, results=[]
success=True, statistics={}, results=[], suite_name="asset.quarantine"
)

ns_2 = ValidationResultIdentifier.from_tuple(
Expand All @@ -195,9 +210,12 @@ def test_ValidationsStore_with_TupleFileSystemStoreBackend(tmp_path_factory):
"batch_id",
)
)
my_store.set(ns_2, ExpectationSuiteValidationResult(success=False))
my_store.set(
ns_2,
ExpectationSuiteValidationResult(success=False, results=[], suite_name="asset.quarantine"),
)
assert my_store.get(ns_2) == ExpectationSuiteValidationResult(
success=False, statistics={}, results=[]
success=False, statistics={}, results=[], suite_name="asset.quarantine"
)

assert set(my_store.list_keys()) == {
Expand Down Expand Up @@ -270,9 +288,12 @@ def test_ValidationsStore_with_DatabaseStoreBackend(sa):
run_id="20191007T151224.1234Z_prod_100",
batch_identifier="batch_id",
)
my_store.set(ns_1, ExpectationSuiteValidationResult(success=True))
my_store.set(
ns_1,
ExpectationSuiteValidationResult(success=True, results=[], suite_name="asset.quarantine"),
)
assert my_store.get(ns_1) == ExpectationSuiteValidationResult(
success=True, statistics={}, results=[]
success=True, statistics={}, results=[], suite_name="asset.quarantine"
)

ns_2 = ValidationResultIdentifier(
Expand All @@ -283,9 +304,12 @@ def test_ValidationsStore_with_DatabaseStoreBackend(sa):
batch_identifier="batch_id",
)

my_store.set(ns_2, ExpectationSuiteValidationResult(success=False))
my_store.set(
ns_2,
ExpectationSuiteValidationResult(success=False, results=[], suite_name="asset.quarantine"),
)
assert my_store.get(ns_2) == ExpectationSuiteValidationResult(
success=False, statistics={}, results=[]
success=False, statistics={}, results=[], suite_name="asset.quarantine"
)

assert set(my_store.list_keys()) == {
Expand Down
1 change: 1 addition & 0 deletions tests/render/fixtures/BasicDatasetProfiler_evrs.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"batch_parameters": {}
},
"success": false,
"suite_name": "default",
"evaluation_parameters": {},
"results": [
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2016,6 +2016,7 @@
}
],
"success": false,
"suite_name": "default",
"statistics": {
"evaluated_expectations": 51,
"successful_expectations": 42,
Expand Down

0 comments on commit 453af44

Please sign in to comment.