contract_validator.py

Code Hygiene Score: 89

Issues 1

Zeile Typ Beschreibung
62 magic_number Magic Number gefunden: 1000

Dependencies 9

Klassen 1

Code

"""Contract Validation Module"""
from typing import Optional, Any
from datetime import datetime

from domain.contracts import ContractValidation
from validators.contract_validator import run_contract_validation

from .contract_parser import ContractParser
from .constants import VALIDATION_PASSED, VALIDATION_FAILED


class ContractValidatorService:
    """Service for validating contracts against their rules"""

    def __init__(self, repository):
        """
        Initialize validator service.

        Args:
            repository: ContractRepository instance
        """
        self.repository = repository
        self.parser = ContractParser()

    def validate_contract(
        self,
        contract_id: int,
        yaml_content: str,
        path: Optional[str] = None,
        triggered_by: str = "mcp",
        start_time: float = 0.0
    ) -> tuple[bool, dict[str, Any], Optional[int]]:
        """
        Validate a contract and save the result.

        Args:
            contract_id: ID of the contract being validated
            yaml_content: YAML content of the contract
            path: Optional specific path to validate
            triggered_by: Who/what triggered the validation
            start_time: Start time for duration calculation

        Returns:
            Tuple of (success, result_dict, validation_id)
        """
        # Parse YAML
        try:
            contract_data = self.parser.parse_yaml(yaml_content)
        except Exception as e:
            return False, {"error": f"Invalid contract YAML: {e}"}, None

        # Run validation
        try:
            result = run_contract_validation(contract_data, path)
        except Exception as e:
            return False, {"error": f"Validation failed: {e}"}, None

        # Calculate duration
        duration_ms = 0
        if start_time > 0:
            import time
            duration_ms = int((time.time() - start_time) * 1000)

        # Save validation result
        validation = ContractValidation(
            contract_id=contract_id,
            validated_at=datetime.now(),
            result=VALIDATION_PASSED if result.outcome == "passed" else VALIDATION_FAILED,
            critical_count=result.critical,
            major_count=result.major,
            minor_count=result.minor,
            violations=result.findings,
            triggered_by=triggered_by,
            target_path=path,
            duration_ms=duration_ms,
        )

        try:
            validation_id = self.repository.save_validation(validation)
        except Exception as e:
            return False, {"error": f"Failed to save validation: {e}"}, None

        return True, result.to_dict(), validation_id

    def get_latest_validations(
        self,
        contract_id: int,
        limit: int = 10
    ) -> list[dict[str, Any]]:
        """
        Get latest validation results for a contract.

        Args:
            contract_id: Contract ID
            limit: Maximum number of results

        Returns:
            List of validation dictionaries
        """
        validations = self.repository.get_validations(contract_id, limit=limit)
        return [v.to_dict() for v in validations]
← Übersicht Graph