Source code for dataframe_expectations.result_message
from abc import ABC
from typing import Optional
from tabulate import tabulate # type: ignore
from dataframe_expectations.core.types import DataFrameLike, DataFrameType
[docs]
class DataFrameExpectationResultMessage(ABC):
"""
Base class for expectation result message.
"""
message: str = ""
def __str__(self):
"""
Print the result of the expectation.
"""
return self.message
[docs]
def dataframe_to_str(self, data_frame_type: DataFrameType, data_frame, rows: int) -> str:
"""
Print the DataFrame based on its type.
"""
if data_frame_type == DataFrameType.PANDAS:
data_frame = data_frame.head(rows)
elif data_frame_type == DataFrameType.PYSPARK:
data_frame = data_frame.limit(rows).toPandas()
else:
raise ValueError(f"Unsupported DataFrame type: {data_frame_type}")
return tabulate(data_frame, headers="keys", tablefmt="pretty", showindex=False)
[docs]
class DataFrameExpectationSuccessMessage(DataFrameExpectationResultMessage):
[docs]
def __init__(self, expectation_name: str, message: Optional[str] = None):
"""
Initialize the expectation success message.
"""
self.message = f"{expectation_name} succeeded."
if message is not None:
self.message = f"{self.message}: {message}"
[docs]
class DataFrameExpectationFailureMessage(DataFrameExpectationResultMessage):
[docs]
def __init__(
self,
expectation_str: str,
data_frame_type: DataFrameType,
violations_data_frame: Optional[DataFrameLike] = None,
message: Optional[str] = None,
limit_violations: int = 5,
):
self.message = expectation_str
if message is not None:
self.message = f"{self.message}: {message}"
if violations_data_frame is not None:
self.data_frame_type = data_frame_type
self.violations_data_frame = violations_data_frame
violations_dataframe_str = self.dataframe_to_str(
data_frame_type=data_frame_type,
data_frame=violations_data_frame,
rows=limit_violations,
)
self.message = (
f"{self.message} \nSome examples of violations: \n{violations_dataframe_str}"
)
[docs]
def get_violations_data_frame(self) -> Optional[DataFrameLike]:
"""
Get the DataFrame with violations.
"""
return self.violations_data_frame if hasattr(self, "violations_data_frame") else None