Eliminate all 103 errors and 96 warnings from the architecture validator: Phase 1 - Validator rules & YAML: - Add NAM-001/NAM-002 exceptions for module-scoped router/service files - Fix API-004 to detect # public comments on decorator lines - Add module-specific exception bases to EXC-004 valid_bases - Exclude storefront files from AUTH-004 store context check - Add SVC-006 exceptions for loyalty service atomic commits - Fix _get_rule() to search naming_rules and auth_rules categories - Use plain # CODE comments instead of # noqa: CODE for custom rules Phase 2 - Billing module (5 route files): - Move _resolve_store_to_merchant to subscription_service - Move tier/feature queries to feature_service, admin_subscription_service - Extract 22 inline Pydantic schemas to billing/schemas/billing.py - Replace all HTTPException with domain exceptions Phase 3 - Loyalty module (4 routes + points_service): - Add 7 domain exceptions (Apple auth, enrollment, device registration) - Add service methods to card_service, program_service, apple_wallet_service - Move all db.query() from routes to service layer - Fix SVC-001: replace HTTPException in points_service with domain exception Phase 4 - Remaining modules: - tenancy: move store stats queries to admin_service - cms: move platform resolution to content_page_service, add NoPlatformSubscriptionException - messaging: move user/customer lookups to messaging_service - Add ConfigDict(from_attributes=True) to ContentPageResponse Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Architecture Validation Scripts
This directory contains scripts for validating and enforcing architectural patterns across the codebase.
Architecture Validator
Overview
validate_architecture.py is an automated tool that checks the codebase against architectural rules defined in .architecture-rules.yaml.
Key Features
- API Endpoint Validation: Ensures proper separation of concerns, Pydantic usage, exception handling
- Service Layer Validation: Enforces domain exceptions, database session patterns
- Model Validation: Checks proper separation of SQLAlchemy and Pydantic models
- Exception Handling: Validates proper exception patterns
- JavaScript Patterns: Enforces coding standards for frontend code
- Template Validation: Ensures templates follow required patterns
Usage
# Validate entire codebase
python scripts/validate/validate_architecture.py
# Validate specific directory
python scripts/validate/validate_architecture.py app/api/
# Verbose output with code context
python scripts/validate/validate_architecture.py --verbose
# Show only errors (suppress warnings)
python scripts/validate/validate_architecture.py --errors-only
# Use custom config file
python scripts/validate/validate_architecture.py --config custom-rules.yaml
Exit Codes
0: Validation passed (warnings allowed)1: Validation failed (errors found)
Integration with Pre-commit
Install pre-commit hooks to run validation automatically:
# Install pre-commit
pip install pre-commit
# Setup hooks
pre-commit install
# Run manually on all files
pre-commit run --all-files
# Run on staged files only
pre-commit run
Configuration
The validation rules are defined in .architecture-rules.yaml at the project root. This file contains:
- Core Principles: Separation of concerns, type safety, exception handling
- API Endpoint Rules: (API-001 through API-004)
- Service Layer Rules: (SVC-001 through SVC-004)
- Model Rules: (MDL-001 through MDL-002)
- Exception Rules: (EXC-001 through EXC-002)
- JavaScript Rules: (JS-001 through JS-003)
- Template Rules: (TPL-001)
Rule Categories
API Endpoint Rules
- API-001: Use Pydantic models for request/response
- API-002: No business logic in endpoints
- API-003: Proper exception handling (catch and convert to HTTPException)
- API-004: Authentication on protected endpoints
Service Layer Rules
- SVC-001: No HTTPException in services (use domain exceptions)
- SVC-002: Create custom exception classes (avoid generic Exception)
- SVC-003: Database session as parameter (not created internally)
- SVC-004: Use Pydantic for input validation
Model Rules
- MDL-001: Use SQLAlchemy Base for database models
- MDL-002: Separate Pydantic from SQLAlchemy models
Exception Rules
- EXC-001: Define custom exceptions in exceptions module
- EXC-002: Never use bare except
JavaScript Rules
- JS-001: Use apiClient directly (not window.apiClient)
- JS-002: Use centralized logger (not console)
- JS-003: Alpine components must spread ...data()
Example Output
🔍 Starting architecture validation...
📡 Validating API endpoints...
🔧 Validating service layer...
📦 Validating models...
⚠️ Validating exception handling...
🟨 Validating JavaScript...
📄 Validating templates...
================================================================================
📊 ARCHITECTURE VALIDATION REPORT
================================================================================
Files checked: 145
Total violations: 3
❌ ERRORS (2):
--------------------------------------------------------------------------------
[API-002] Endpoint must NOT contain business logic
File: app/api/v1/admin/stores.py:45
Issue: Database operations should be in service layer
💡 Suggestion: Move database operations to service layer
[SVC-001] Service must NOT raise HTTPException
File: app/services/store_service.py:78
Issue: Service raises HTTPException - use domain exceptions instead
💡 Suggestion: Create custom exception class (e.g., StoreNotFoundError) and raise that
⚠️ WARNINGS (1):
--------------------------------------------------------------------------------
[JS-001] Use apiClient directly
File: static/admin/js/stores.js:23
Issue: Use apiClient directly instead of window.apiClient
💡 Suggestion: Replace window.apiClient with apiClient
================================================================================
❌ VALIDATION FAILED - Fix errors before committing
================================================================================
CI/CD Integration
Add to your CI pipeline (GitHub Actions example):
# .github/workflows/ci.yml
name: CI
on: [push, pull_request]
jobs:
validate-architecture:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.10'
- name: Install dependencies
run: |
pip install pyyaml
- name: Validate Architecture
run: |
python scripts/validate/validate_architecture.py
Documentation
For detailed architectural patterns and examples, see:
Extending the Validator
To add new rules:
- Add rule definition to
.architecture-rules.yaml - Implement validation logic in
validate_architecture.py - Add examples to
docs/architecture/architecture-patterns.md - Test with
python scripts/validate/validate_architecture.py --verbose
Troubleshooting
Issue: Validator reports false positives
Solution: Add exception patterns to .architecture-rules.yaml under ignore section
Issue: Validator doesn't catch a specific violation
Solution: The rule might not be implemented yet. Check .architecture-rules.yaml and validate_architecture.py to add the rule.
Issue: Pre-commit hook fails but manual run passes
Solution: Ensure pre-commit is using the same Python environment:
pre-commit clean
pre-commit install
Contributing
When adding new architectural patterns:
- Document the pattern in
docs/architecture/architecture-patterns.md - Add validation rule to
.architecture-rules.yaml - Implement validation in
validate_architecture.py - Test thoroughly with existing codebase
- Update this README with the new rule
Questions? See the Architecture Patterns Documentation