Add new validation rules MOD-020 to MOD-023 for module definition completeness and standardize permissions across all modules. Changes: - Add MOD-020: Module definitions must have required attributes - Add MOD-021: Modules with menus should have features - Add MOD-022: Feature modules should have permissions - Add MOD-023: Modules with routers should use get_*_with_routers pattern Module permissions added: - analytics: view, export, manage_dashboards - billing: view_tiers, manage_tiers, view_subscriptions, manage_subscriptions, view_invoices - cart: view, manage - checkout: view_settings, manage_settings - cms: view_pages, manage_pages, view_media, manage_media, manage_themes - loyalty: view_programs, manage_programs, view_rewards, manage_rewards - marketplace: view_integration, manage_integration, sync_products - messaging: view_messages, send_messages, manage_templates - payments: view_gateways, manage_gateways, view_transactions Module improvements: - Complete cart module with features and permissions - Complete checkout module with features and permissions - Add features to catalog module - Add version to cms module - Fix loyalty platform_router attachment - Add path definitions to payments module - Remove empty scheduled_tasks from dev_tools module Documentation: - Update module-system.md with new validation rules - Update architecture-rules.md with MOD-020 to MOD-023 Tests: - Add unit tests for module definition completeness - Add tests for permission structure validation Co-Authored-By: Claude Opus 4.5 <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_architecture.py
# Validate specific directory
python scripts/validate_architecture.py app/api/
# Verbose output with code context
python scripts/validate_architecture.py --verbose
# Show only errors (suppress warnings)
python scripts/validate_architecture.py --errors-only
# Use custom config file
python scripts/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/vendors.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/vendor_service.py:78
Issue: Service raises HTTPException - use domain exceptions instead
💡 Suggestion: Create custom exception class (e.g., VendorNotFoundError) and raise that
⚠️ WARNINGS (1):
--------------------------------------------------------------------------------
[JS-001] Use apiClient directly
File: static/admin/js/vendors.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_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_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