All checks were successful
- Add centralized _is_noqa_suppressed() to BaseValidator with normalization (accepts both SEC001 and SEC-001 formats for ruff compatibility) - Wire noqa support into all 21 security and 18 performance check functions - Add ruff external config for SEC/PERF/MOD/EXC codes in pyproject.toml - Convert all 280 Python noqa comments to dashless format (ruff-compatible) - Add site/ to IGNORE_PATTERNS (excludes mkdocs build output) - Suppress 152 false positive findings (test passwords, seed data, validator self-references, Apple Wallet SHA1, etc.) - Security: 79 errors → 0, 60 warnings → 0 - Performance: 80 warnings → 77 (3 test script suppressions) - Add proposal doc with noqa inventory and remaining findings recommendations Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
174 lines
5.4 KiB
Python
174 lines
5.4 KiB
Python
# app/modules/monitoring/exceptions.py
|
|
"""
|
|
Monitoring module exceptions.
|
|
|
|
This module provides exception classes for monitoring operations including:
|
|
- Background task tracking
|
|
- Capacity snapshot management
|
|
- Code quality/architecture scans
|
|
"""
|
|
|
|
from app.exceptions.base import (
|
|
BusinessLogicException,
|
|
ExternalServiceException,
|
|
ResourceNotFoundException,
|
|
ValidationException,
|
|
)
|
|
|
|
__all__ = [
|
|
# Task exceptions
|
|
"TaskNotFoundException",
|
|
# Capacity exceptions
|
|
"CapacitySnapshotNotFoundException",
|
|
# General monitoring exceptions
|
|
"MonitoringServiceException",
|
|
# Code quality exceptions
|
|
"ViolationNotFoundException",
|
|
"ScanNotFoundException",
|
|
"ScanExecutionException",
|
|
"ScanTimeoutException",
|
|
"ScanParseException",
|
|
"ViolationOperationException",
|
|
"InvalidViolationStatusException",
|
|
]
|
|
|
|
|
|
# =============================================================================
|
|
# Task Exceptions
|
|
# =============================================================================
|
|
|
|
|
|
class TaskNotFoundException(ResourceNotFoundException): # noqa: MOD025
|
|
"""Raised when a background task is not found."""
|
|
|
|
def __init__(self, task_id: str):
|
|
super().__init__(
|
|
resource_type="BackgroundTask",
|
|
identifier=task_id,
|
|
error_code="TASK_NOT_FOUND",
|
|
)
|
|
|
|
|
|
# =============================================================================
|
|
# Capacity Exceptions
|
|
# =============================================================================
|
|
|
|
|
|
class CapacitySnapshotNotFoundException(ResourceNotFoundException): # noqa: MOD025
|
|
"""Raised when a capacity snapshot is not found."""
|
|
|
|
def __init__(self, snapshot_id: int):
|
|
super().__init__(
|
|
resource_type="CapacitySnapshot",
|
|
identifier=str(snapshot_id),
|
|
error_code="CAPACITY_SNAPSHOT_NOT_FOUND",
|
|
)
|
|
|
|
|
|
# =============================================================================
|
|
# General Monitoring Exceptions
|
|
# =============================================================================
|
|
|
|
|
|
class MonitoringServiceException(BusinessLogicException): # noqa: MOD025
|
|
"""Raised when a monitoring operation fails."""
|
|
|
|
def __init__(self, operation: str, reason: str):
|
|
super().__init__(
|
|
message=f"Monitoring operation '{operation}' failed: {reason}",
|
|
error_code="MONITORING_OPERATION_FAILED",
|
|
details={"operation": operation, "reason": reason},
|
|
)
|
|
|
|
|
|
# =============================================================================
|
|
# Code Quality Exceptions
|
|
# =============================================================================
|
|
|
|
|
|
class ViolationNotFoundException(ResourceNotFoundException):
|
|
"""Raised when a violation is not found."""
|
|
|
|
def __init__(self, violation_id: int):
|
|
super().__init__(
|
|
resource_type="Violation",
|
|
identifier=str(violation_id),
|
|
error_code="VIOLATION_NOT_FOUND",
|
|
)
|
|
|
|
|
|
class ScanNotFoundException(ResourceNotFoundException):
|
|
"""Raised when a scan is not found."""
|
|
|
|
def __init__(self, scan_id: int):
|
|
super().__init__(
|
|
resource_type="Scan",
|
|
identifier=str(scan_id),
|
|
error_code="SCAN_NOT_FOUND",
|
|
)
|
|
|
|
|
|
class ScanExecutionException(ExternalServiceException): # noqa: MOD025
|
|
"""Raised when architecture scan execution fails."""
|
|
|
|
def __init__(self, reason: str):
|
|
super().__init__(
|
|
service_name="ArchitectureValidator",
|
|
message=f"Scan execution failed: {reason}",
|
|
error_code="SCAN_EXECUTION_FAILED",
|
|
)
|
|
|
|
|
|
class ScanTimeoutException(ExternalServiceException):
|
|
"""Raised when architecture scan times out."""
|
|
|
|
def __init__(self, timeout_seconds: int = 300):
|
|
super().__init__(
|
|
service_name="ArchitectureValidator",
|
|
message=f"Scan timed out after {timeout_seconds} seconds",
|
|
error_code="SCAN_TIMEOUT",
|
|
details={"timeout_seconds": timeout_seconds},
|
|
)
|
|
|
|
|
|
class ScanParseException(BusinessLogicException):
|
|
"""Raised when scan results cannot be parsed."""
|
|
|
|
def __init__(self, reason: str):
|
|
super().__init__(
|
|
message=f"Failed to parse scan results: {reason}",
|
|
error_code="SCAN_PARSE_FAILED",
|
|
details={"reason": reason},
|
|
)
|
|
|
|
|
|
class ViolationOperationException(BusinessLogicException): # noqa: MOD025
|
|
"""Raised when a violation operation fails."""
|
|
|
|
def __init__(self, operation: str, violation_id: int, reason: str):
|
|
super().__init__(
|
|
message=f"Failed to {operation} violation {violation_id}: {reason}",
|
|
error_code="VIOLATION_OPERATION_FAILED",
|
|
details={
|
|
"operation": operation,
|
|
"violation_id": violation_id,
|
|
"reason": reason,
|
|
},
|
|
)
|
|
|
|
|
|
class InvalidViolationStatusException(ValidationException): # noqa: MOD025
|
|
"""Raised when a violation status transition is invalid."""
|
|
|
|
def __init__(self, violation_id: int, current_status: str, target_status: str):
|
|
super().__init__(
|
|
message=f"Cannot change violation {violation_id} from '{current_status}' to '{target_status}'",
|
|
field="status",
|
|
details={
|
|
"violation_id": violation_id,
|
|
"current_status": current_status,
|
|
"target_status": target_status,
|
|
},
|
|
)
|
|
self.error_code = "INVALID_VIOLATION_STATUS"
|