113 lines
4.0 KiB
Python
113 lines
4.0 KiB
Python
|
|
"""
|
||
|
|
Validation result classes for data validation.
|
||
|
|
|
||
|
|
This module provides result classes used to represent validation outcomes
|
||
|
|
across the validation system.
|
||
|
|
"""
|
||
|
|
|
||
|
|
from typing import List, Any, Optional, Dict
|
||
|
|
|
||
|
|
|
||
|
|
class ValidationResult:
|
||
|
|
"""Simple validation result for individual field validation."""
|
||
|
|
|
||
|
|
def __init__(self,
|
||
|
|
is_valid: bool,
|
||
|
|
errors: List[str] = None,
|
||
|
|
warnings: List[str] = None,
|
||
|
|
sanitized_data: Any = None):
|
||
|
|
"""
|
||
|
|
Initialize validation result.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
is_valid: Whether the validation passed
|
||
|
|
errors: List of error messages
|
||
|
|
warnings: List of warning messages
|
||
|
|
sanitized_data: Optional sanitized/normalized data
|
||
|
|
"""
|
||
|
|
self.is_valid = is_valid
|
||
|
|
self.errors = errors or []
|
||
|
|
self.warnings = warnings or []
|
||
|
|
self.sanitized_data = sanitized_data
|
||
|
|
|
||
|
|
def __str__(self) -> str:
|
||
|
|
"""String representation of validation result."""
|
||
|
|
status = "valid" if self.is_valid else "invalid"
|
||
|
|
details = []
|
||
|
|
if self.errors:
|
||
|
|
details.append(f"{len(self.errors)} errors")
|
||
|
|
if self.warnings:
|
||
|
|
details.append(f"{len(self.warnings)} warnings")
|
||
|
|
detail_str = f" with {', '.join(details)}" if details else ""
|
||
|
|
return f"ValidationResult: {status}{detail_str}"
|
||
|
|
|
||
|
|
def add_error(self, error: str) -> None:
|
||
|
|
"""Add an error message and set is_valid to False."""
|
||
|
|
self.errors.append(error)
|
||
|
|
self.is_valid = False
|
||
|
|
|
||
|
|
def add_warning(self, warning: str) -> None:
|
||
|
|
"""Add a warning message."""
|
||
|
|
self.warnings.append(warning)
|
||
|
|
|
||
|
|
def merge(self, other: 'ValidationResult') -> None:
|
||
|
|
"""Merge another validation result into this one."""
|
||
|
|
self.is_valid = self.is_valid and other.is_valid
|
||
|
|
self.errors.extend(other.errors)
|
||
|
|
self.warnings.extend(other.warnings)
|
||
|
|
# Don't merge sanitized data - it's context specific
|
||
|
|
|
||
|
|
|
||
|
|
class DataValidationResult:
|
||
|
|
"""Result of data validation - common across all exchanges."""
|
||
|
|
|
||
|
|
def __init__(self,
|
||
|
|
is_valid: bool,
|
||
|
|
errors: List[str],
|
||
|
|
warnings: List[str],
|
||
|
|
sanitized_data: Optional[Dict[str, Any]] = None):
|
||
|
|
"""
|
||
|
|
Initialize data validation result.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
is_valid: Whether the validation passed
|
||
|
|
errors: List of error messages
|
||
|
|
warnings: List of warning messages
|
||
|
|
sanitized_data: Optional sanitized/normalized data dictionary
|
||
|
|
"""
|
||
|
|
self.is_valid = is_valid
|
||
|
|
self.errors = errors
|
||
|
|
self.warnings = warnings
|
||
|
|
self.sanitized_data = sanitized_data
|
||
|
|
|
||
|
|
def __str__(self) -> str:
|
||
|
|
"""String representation of data validation result."""
|
||
|
|
status = "valid" if self.is_valid else "invalid"
|
||
|
|
details = []
|
||
|
|
if self.errors:
|
||
|
|
details.append(f"{len(self.errors)} errors")
|
||
|
|
if self.warnings:
|
||
|
|
details.append(f"{len(self.warnings)} warnings")
|
||
|
|
if self.sanitized_data:
|
||
|
|
details.append("has sanitized data")
|
||
|
|
detail_str = f" with {', '.join(details)}" if details else ""
|
||
|
|
return f"DataValidationResult: {status}{detail_str}"
|
||
|
|
|
||
|
|
def add_error(self, error: str) -> None:
|
||
|
|
"""Add an error message and set is_valid to False."""
|
||
|
|
self.errors.append(error)
|
||
|
|
self.is_valid = False
|
||
|
|
|
||
|
|
def add_warning(self, warning: str) -> None:
|
||
|
|
"""Add a warning message."""
|
||
|
|
self.warnings.append(warning)
|
||
|
|
|
||
|
|
def merge(self, other: 'DataValidationResult') -> None:
|
||
|
|
"""Merge another data validation result into this one."""
|
||
|
|
self.is_valid = self.is_valid and other.is_valid
|
||
|
|
self.errors.extend(other.errors)
|
||
|
|
self.warnings.extend(other.warnings)
|
||
|
|
if other.sanitized_data:
|
||
|
|
if not self.sanitized_data:
|
||
|
|
self.sanitized_data = {}
|
||
|
|
self.sanitized_data.update(other.sanitized_data)
|