#!/bin/bash # Environment Setup Script for Formal Specification Generation System # This script initializes the development environment and checks dependencies 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 # Function to print colored output print_status() { echo -e "${BLUE}[INFO]${NC} $1" } print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } # Function to check if command exists command_exists() { command -v "$1" >/dev/null 2>&1 } # Function to check Python version check_python() { print_status "Checking Python installation..." if ! command_exists python3; then print_error "Python 3 is not installed. Please install Python 3.8 or later." exit 1 fi PYTHON_VERSION=$(python3 -c 'import sys; print(".".join(map(str, sys.version_info[:2])))') REQUIRED_VERSION="3.8" if python3 -c "import sys; exit(0 if sys.version_info >= (3, 8) else 1)"; then print_success "Python $PYTHON_VERSION found (>= $REQUIRED_VERSION)" else print_error "Python $PYTHON_VERSION found, but $REQUIRED_VERSION or later is required" exit 1 fi } # Function to check CBMC installation check_cbmc() { print_status "Checking CBMC installation..." if ! command_exists cbmc; then print_warning "CBMC is not installed or not in PATH" print_status "Please install CBMC 5.0 or later:" echo " - Ubuntu/Debian: sudo apt-get install cbmc" echo " - Or download from: https://github.com/diffblue/cbmc" echo " - Make sure cbmc is in your PATH" return 1 fi CBMC_VERSION=$(cbmc --version 2>/dev/null | head -n1 || echo "unknown") print_success "CBMC found: $CBMC_VERSION" } # Function to check pip check_pip() { print_status "Checking pip installation..." if ! command_exists pip3; then print_error "pip3 is not installed. Please install pip for Python 3." exit 1 fi print_success "pip3 found" } # Function to create virtual environment create_venv() { print_status "Creating virtual environment..." if [ -d "venv" ]; then print_warning "Virtual environment already exists" return 0 fi python3 -m venv venv print_success "Virtual environment created" } # Function to activate virtual environment and install dependencies install_dependencies() { print_status "Installing Python dependencies..." # Activate virtual environment source venv/bin/activate # Upgrade pip pip install --upgrade pip # Install requirements if [ -f "requirements.txt" ]; then pip install -r requirements.txt print_success "Dependencies installed from requirements.txt" else print_error "requirements.txt not found" exit 1 fi } # Function to create necessary directories create_directories() { print_status "Creating necessary directories..." directories=( "logs" "uploads" "config" "cbmc/proofs" "cbmc/harnesses" "cbmc/configs" "results" "temp" ) for dir in "${directories[@]}"; do if [ ! -d "$dir" ]; then mkdir -p "$dir" print_status "Created directory: $dir" fi done print_success "All directories created" } # Function to create .env file create_env_file() { print_status "Creating environment configuration..." if [ ! -f ".env" ]; then if [ -f ".env.template" ]; then cp .env.template .env print_success "Created .env file from template" print_warning "Please edit .env file and add your SiliconFlow API key" else print_error ".env.template not found" exit 1 fi else print_warning ".env file already exists" fi } # Function to validate configuration validate_config() { print_status "Validating configuration..." # Check if .env file exists if [ ! -f ".env" ]; then print_error ".env file not found. Please create it from .env.template" return 1 fi # Source .env file to check environment variables source .env # Check required environment variables required_vars=( "SILICONFLOW_API_KEY" ) missing_vars=() for var in "${required_vars[@]}"; do if [ -z "${!var}" ]; then missing_vars+=("$var") fi done if [ ${#missing_vars[@]} -gt 0 ]; then print_error "Missing required environment variables:" for var in "${missing_vars[@]}"; do echo " - $var" done print_warning "Please add these variables to your .env file" return 1 fi print_success "Configuration validation passed" } # Function to run basic tests run_tests() { print_status "Running basic tests..." # Activate virtual environment source venv/bin/activate # Run Python import tests python -c " import sys sys.path.insert(0, 'src') try: from utils.config import get_config from utils.logger import get_logger print('✓ Core utilities import successful') config = get_config() print('✓ Configuration loading successful') logger = get_logger('test') logger.info('Test message') print('✓ Logging system working') except ImportError as e: print(f'✗ Import error: {e}') sys.exit(1) except Exception as e: print(f'✗ Error: {e}') sys.exit(1) " if [ $? -eq 0 ]; then print_success "Basic tests passed" else print_error "Basic tests failed" return 1 fi } # Function to show usage information show_usage() { echo "Usage: $0 [OPTIONS]" echo "" echo "Options:" echo " -h, --help Show this help message" echo " -f, --force Force recreation of virtual environment" echo " -s, --skip-tests Skip running tests" echo " -v, --verbose Verbose output" echo "" echo "This script sets up the development environment for the Formal" echo "Specification Generation System." } # Main setup function main() { local force_recreate=false local skip_tests=false local verbose=false # Parse command line arguments while [[ $# -gt 0 ]]; do case $1 in -h|--help) show_usage exit 0 ;; -f|--force) force_recreate=true shift ;; -s|--skip-tests) skip_tests=true shift ;; -v|--verbose) verbose=true set -x # Enable command tracing shift ;; *) print_error "Unknown option: $1" show_usage exit 1 ;; esac done print_status "Starting environment setup..." print_status "Project: Formal Specification Generation System" print_status "==========================================" # Check dependencies check_python check_pip check_cbmc # Force recreate virtual environment if requested if [ "$force_recreate" = true ] && [ -d "venv" ]; then print_status "Removing existing virtual environment..." rm -rf venv fi # Setup environment create_venv install_dependencies create_directories create_env_file # Validate configuration if ! validate_config; then print_error "Configuration validation failed" exit 1 fi # Run tests unless skipped if [ "$skip_tests" = false ]; then if ! run_tests; then print_error "Setup tests failed" exit 1 fi fi print_success "" print_success "Environment setup completed successfully!" print_success "" print_status "Next steps:" echo " 1. Edit .env file to add your API keys if needed" echo " 2. Activate virtual environment: source venv/bin/activate" echo " 3. (Web UI coming soon) Run the web server: python -m src.ui.web_app" echo " 4. Open http://localhost:8080 in your browser" echo "" print_status "Available now:" echo " - Use CLI: python -m src.ui.cli (once implemented)" echo " - Test core utilities: python -c 'from src.utils.config import get_config; print(\"Config loaded successfully\")'" print_success "" } # Run main function main "$@"