#!/bin/bash # Model Manager Code Validation Script # This script runs all code quality checks before committing or deploying # # Usage: # ./validate.sh # Run all checks including tests (default) # ./validate.sh --no-tests # Skip unit tests # ./validate.sh --skip-tests # Skip unit tests (alias) # ./validate.sh --only-tests # Run only unit tests # ./validate.sh --fix # Auto-fix formatting and linting, then run validations (no tests) set -e # Exit on any error # Parse command line arguments RUN_TESTS=true ONLY_TESTS=false FIX_MODE=false for arg in "$@"; do case $arg in --no-tests|--skip-tests) RUN_TESTS=false shift ;; --only-tests) ONLY_TESTS=true shift ;; --fix) FIX_MODE=true RUN_TESTS=false shift ;; --help|-h) echo "Usage: $0 [OPTIONS]" echo "" echo "Options:" echo " --no-tests, --skip-tests Skip unit tests (default: run tests)" echo " --only-tests Run only unit tests" echo " --fix Auto-fix formatting and linting, then run validations (no tests)" echo " --help, -h Show this help message" echo "" exit 0 ;; *) echo "Unknown option: $arg" echo "Use --help for usage information" exit 1 ;; esac done # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color echo -e "${BLUE}╔════════════════════════════════════════════════════════╗${NC}" echo -e "${BLUE}║ Model Manager - Code Validation Suite ║${NC}" echo -e "${BLUE}╚════════════════════════════════════════════════════════╝${NC}" echo "" # Handle --fix mode if [ "$FIX_MODE" = true ]; then echo -e "${BLUE}🔧 Running auto-fix mode...${NC}" echo "" echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${BLUE}▶ Auto-fixing code formatting (Ruff)${NC}" echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" ruff format model_manager/ tests/ echo -e "${GREEN}✅ Code formatting applied${NC}" echo "" echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${BLUE}▶ Auto-fixing linting issues (Ruff)${NC}" echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" ruff check --fix model_manager/ tests/ echo -e "${GREEN}✅ Linting fixes applied${NC}" echo "" echo -e "${YELLOW}ℹ️ Now running validations (without tests)...${NC}" echo "" fi # Handle --only-tests mode if [ "$ONLY_TESTS" = true ]; then echo -e "${BLUE}🧪 Running only unit tests...${NC}" echo "" fi if [ "$RUN_TESTS" = false ] && [ "$ONLY_TESTS" = false ]; then echo -e "${YELLOW}ℹ️ Unit tests will be skipped${NC}" echo "" fi # 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=() # Handle --only-tests mode if [ "$ONLY_TESTS" = true ]; then # Step 5: Unit Tests (pytest) if ! run_step "Unit Tests (pytest)" "pytest tests/ --cov=model_manager --cov-report=term-missing --cov-report=xml --cov-report=html --cov-fail-under=80 -q"; then FAILED_STEPS+=("Unit Tests") fi else # Step 1: Code Formatting Check (Ruff) if ! run_step "1. Code Formatting (Ruff)" "ruff format --check model_manager/ tests/"; then FAILED_STEPS+=("Code Formatting") fi # Step 2: Linting (Ruff) if ! run_step "2. Code Linting (Ruff)" "ruff check model_manager/ tests/"; then FAILED_STEPS+=("Linting") fi # Step 3: Type Checking (mypy) if ! run_step "3. Type Checking (mypy)" "mypy model_manager/"; then FAILED_STEPS+=("Type Checking") fi # Step 4: Security Analysis (Bandit) if ! run_step "4. Security Analysis (Bandit)" "bandit -r model_manager/ -ll -q"; then FAILED_STEPS+=("Security Analysis") fi # Step 5: Unit Tests (pytest) if [ "$RUN_TESTS" = true ]; then if ! run_step "5. Unit Tests (pytest)" "pytest tests/ --cov=model_manager --cov-report=term-missing --cov-report=xml --cov-report=html --cov-fail-under=80 -q"; then FAILED_STEPS+=("Unit Tests") fi else echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${BLUE}▶ 5. Unit Tests (pytest)${NC}" echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" echo -e "${YELLOW}⏭️ Unit Tests - SKIPPED${NC}" echo "" fi 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 model_manager/ tests/' to auto-fix formatting${NC}" echo -e "${YELLOW} • Run 'ruff check --fix model_manager/ 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