Problem: - Ruff removed 'from app.core.database import Base' from models/database/base.py - Import appeared "unused" (F401) but was actually a critical re-export - Caused ImportError: cannot import name 'Base' at runtime - Re-export pattern: import in one file to export from package Solution: 1. Added F401 ignore for models/database/base.py in pyproject.toml 2. Created scripts/verify_critical_imports.py verification script 3. Integrated verification into make check and CI pipeline 4. Updated documentation with explanation New Verification Script: - Checks all critical re-export imports exist - Detects import variations (parentheses, 'as' clauses) - Handles SQLAlchemy declarative_base alternatives - Runs as part of make check automatically Protected Files: - models/database/base.py - Re-exports Base for all models - models/__init__.py - Exports Base for Alembic - models/database/__init__.py - Exports Base from package - All __init__.py files (already protected) Makefile Changes: - make verify-imports - Run import verification - make check - Now includes verify-imports - make ci - Includes verify-imports in pipeline Documentation Updated: - Code quality guide explains re-export protection - Pre-commit workflow includes verification - Examples of why re-exports matter This prevents future issues where linters remove seemingly "unused" imports that are actually critical for application structure. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
61 lines
2.0 KiB
Python
61 lines
2.0 KiB
Python
# app/exceptions/order.py
|
|
"""
|
|
Order management specific exceptions.
|
|
"""
|
|
|
|
from .base import BusinessLogicException, ResourceNotFoundException, ValidationException
|
|
|
|
|
|
class OrderNotFoundException(ResourceNotFoundException):
|
|
"""Raised when an order is not found."""
|
|
|
|
def __init__(self, order_identifier: str):
|
|
super().__init__(
|
|
resource_type="Order",
|
|
identifier=order_identifier,
|
|
message=f"Order '{order_identifier}' not found",
|
|
error_code="ORDER_NOT_FOUND",
|
|
)
|
|
|
|
|
|
class OrderAlreadyExistsException(ValidationException):
|
|
"""Raised when trying to create a duplicate order."""
|
|
|
|
def __init__(self, order_number: str):
|
|
super().__init__(
|
|
message=f"Order with number '{order_number}' already exists",
|
|
error_code="ORDER_ALREADY_EXISTS",
|
|
details={"order_number": order_number},
|
|
)
|
|
|
|
|
|
class OrderValidationException(ValidationException):
|
|
"""Raised when order data validation fails."""
|
|
|
|
def __init__(self, message: str, details: dict | None = None):
|
|
super().__init__(
|
|
message=message, error_code="ORDER_VALIDATION_FAILED", details=details
|
|
)
|
|
|
|
|
|
class InvalidOrderStatusException(BusinessLogicException):
|
|
"""Raised when trying to set an invalid order status."""
|
|
|
|
def __init__(self, current_status: str, new_status: str):
|
|
super().__init__(
|
|
message=f"Cannot change order status from '{current_status}' to '{new_status}'",
|
|
error_code="INVALID_ORDER_STATUS_CHANGE",
|
|
details={"current_status": current_status, "new_status": new_status},
|
|
)
|
|
|
|
|
|
class OrderCannotBeCancelledException(BusinessLogicException):
|
|
"""Raised when order cannot be cancelled."""
|
|
|
|
def __init__(self, order_number: str, reason: str):
|
|
super().__init__(
|
|
message=f"Order '{order_number}' cannot be cancelled: {reason}",
|
|
error_code="ORDER_CANNOT_BE_CANCELLED",
|
|
details={"order_number": order_number, "reason": reason},
|
|
)
|