#!/bin/bash # Model Manager Code Validation Script # This script runs all code quality checks before committing or deploying set -e # Exit on any error # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Args FIX_MODE=false while [[ $# -gt 0 ]]; do case "$1" in --fix) FIX_MODE=true shift ;; -h|--help) echo "Usage: $0 [--fix]" echo " --fix Apply Ruff auto-fixes (format and lint fixes)." exit 0 ;; *) echo -e "${RED}Unknown option: $1${NC}" echo "Usage: $0 [--fix]" exit 2 ;; esac done echo -e "${BLUE}╔════════════════════════════════════════════════════════╗${NC}" echo -e "${BLUE}║ Model Manager - Code Validation Suite ║${NC}" echo -e "${BLUE}╚════════════════════════════════════════════════════════╝${NC}" echo "" # Check if virtual environment is activated if [[ -z "${VIRTUAL_ENV}" ]] && [[ -z "${CONDA_DEFAULT_ENV}" ]]; then echo -e "${YELLOW}⚠️ Warning: No virtual environment detected${NC}" echo -e "${YELLOW} Consider activating your venv/conda environment${NC}" echo "" fi # Function to run a validation step run_step() { local step_name=$1 local step_command=$2 echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${BLUE}▶ ${step_name}${NC}" echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" if eval "$step_command"; then echo -e "${GREEN}✅ ${step_name} - PASSED${NC}" echo "" return 0 else echo -e "${RED}❌ ${step_name} - FAILED${NC}" echo "" return 1 fi } # Track failures FAILED_STEPS=() # Step 1: Code Formatting Check (Ruff) # - default: check only # - --fix: write changes if ! run_step "1. Code Formatting (Ruff)" "if \$FIX_MODE; then ruff format scouter/ tests/; else ruff format --check scouter/ tests/; fi"; then FAILED_STEPS+=("Code Formatting") fi # Step 2: Linting (Ruff) # - default: check only # - --fix: apply autofixes if ! run_step "2. Code Linting (Ruff)" "if \$FIX_MODE; then ruff check --fix scouter/ tests/; else ruff check scouter/ tests/; fi"; then FAILED_STEPS+=("Linting") fi # Step 3: Type Checking (mypy) if ! run_step "3. Type Checking (mypy)" "mypy scouter/"; then FAILED_STEPS+=("Type Checking") fi # Step 4: Security Analysis (Bandit) if ! run_step "4. Security Analysis (Bandit)" "bandit -r scouter/ -ll -q"; then FAILED_STEPS+=("Security Analysis") fi # Step 5: Unit Tests (pytest) if ! run_step "5. Unit Tests (pytest)" "pytest tests/ --cov=scouter --cov-report=term-missing --cov-report=xml --cov-report=html --cov-fail-under=80 -q"; then FAILED_STEPS+=("Unit Tests") fi # Summary echo -e "${BLUE}╔════════════════════════════════════════════════════════╗${NC}" echo -e "${BLUE}║ Validation Summary ║${NC}" echo -e "${BLUE}╚════════════════════════════════════════════════════════╝${NC}" echo "" if [ ${#FAILED_STEPS[@]} -eq 0 ]; then echo -e "${GREEN}✅ All validation checks passed!${NC}" echo -e "${GREEN} Your code is ready for commit/deployment.${NC}" echo "" exit 0 else echo -e "${RED}❌ Validation failed for the following steps:${NC}" for step in "${FAILED_STEPS[@]}"; do echo -e "${RED} • ${step}${NC}" done echo "" echo -e "${YELLOW}💡 Tips:${NC}" echo -e "${YELLOW} • Run 'ruff format scouter/ tests/' to auto-fix formatting${NC}" echo -e "${YELLOW} • Run 'ruff check --fix scouter/ tests/' to auto-fix linting issues${NC}" echo -e "${YELLOW} • Review mypy errors and add type hints where needed${NC}" echo -e "${YELLOW} • Check bandit warnings for security issues${NC}" echo -e "${YELLOW} • Fix failing tests or improve test coverage${NC}" echo "" exit 1 fi