This commit introduces a new test suite for the Activities class, achieving 100% coverage. Additionally, the validation script (validate.sh) is enhanced with new options: - --fix: Automatically fixes code formatting and linting issues using Ruff. - --only-tests: Runs only the unit tests, skipping other validation steps. The validation script now also supports skipping tests and provides more informative output.
196 lines
7.8 KiB
Bash
Executable File
196 lines
7.8 KiB
Bash
Executable File
#!/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
|