Files
orion/app/modules/monitoring/exceptions.py
Samir Boulahtit 1b8a40f1ff
All checks were successful
CI / dependency-scanning (push) Successful in 27s
CI / docs (push) Successful in 35s
CI / ruff (push) Successful in 8s
CI / pytest (push) Successful in 34m22s
CI / validate (push) Successful in 19s
CI / deploy (push) Successful in 2m25s
feat(validators): add noqa suppression support to security and performance validators
- 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>
2026-02-14 22:56:56 +01:00

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"