diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..2ff880c --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +# Auto detect text files +* text=auto + +# Shell scripts should always use LF line endings +*.sh text eol=lf diff --git a/.gitignore b/.gitignore index 48fc217..1da7c4e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,11 +6,13 @@ # Allow specific file types and root files !*.py +!*.sh # Allow GitHub files !/.github/** # Allow root files +!/.gitattributes !/assets/** !/CONTRIBUTING.md !/LICENSE diff --git a/scripts/pre_commit.sh b/scripts/pre_commit.sh new file mode 100755 index 0000000..18e66af --- /dev/null +++ b/scripts/pre_commit.sh @@ -0,0 +1,159 @@ +#!/bin/bash + +# AstrAI Pre-commit Check Script +# Runs code format check and tests before committing + +set -e + +# Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Print colored messages +print_info() { + echo -e "${YELLOW}[INFO]${NC} $1" +} + +print_success() { + echo -e "${GREEN}[SUCCESS]${NC} $1" +} + +print_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# Check if in project root directory +check_project_root() { + if [ ! -f "pyproject.toml" ]; then + print_error "Please run this script from the project root directory" + exit 1 + fi +} + +# Check if Python is installed +check_python() { + if ! command -v python &> /dev/null; then + print_error "Python is not installed" + exit 1 + fi + print_info "Python version: $(python --version)" +} + +# Install development dependencies +install_dependencies() { + print_info "Installing development dependencies..." + pip install --upgrade pip + pip install .[dev] + print_success "Dependencies installed" +} + +# Run code format check +run_lint() { + print_info "Running code format check (ruff format)..." + if ruff format --check .; then + print_success "Code format check passed" + else + print_error "Code format check failed. Please run 'ruff format .' to fix formatting issues" + exit 1 + fi +} + +# Run code style check (linter) +run_ruff_lint() { + print_info "Running code style check (ruff check)..." + if ruff check .; then + print_success "Code style check passed" + else + print_error "Code style check failed. Please fix the issues above" + exit 1 + fi +} + +# Run tests +run_tests() { + print_info "Running tests..." + if python -m pytest tests/ -v; then + print_success "All tests passed" + else + print_error "Tests failed" + exit 1 + fi +} + +# Main function +main() { + echo "========================================" + echo " AstrAI Pre-commit Check Script" + echo "========================================" + echo "" + + check_project_root + check_python + + # Parse arguments + SKIP_DEPS=false + SKIP_LINT=false + SKIP_TESTS=false + + while [[ $# -gt 0 ]]; do + case $1 in + --skip-deps) + SKIP_DEPS=true + shift + ;; + --skip-lint) + SKIP_LINT=true + shift + ;; + --skip-tests) + SKIP_TESTS=true + shift + ;; + --help) + echo "Usage: $0 [options]" + echo "" + echo "Options:" + echo " --skip-deps Skip dependency installation" + echo " --skip-lint Skip code checks" + echo " --skip-tests Skip tests" + echo " --help Show this help message" + exit 0 + ;; + *) + print_error "Unknown option: $1" + exit 1 + ;; + esac + done + + # Install dependencies + if [ "$SKIP_DEPS" = false ]; then + install_dependencies + else + print_info "Skipping dependency installation" + fi + + # Run code checks + if [ "$SKIP_LINT" = false ]; then + run_lint + run_ruff_lint + else + print_info "Skipping code checks" + fi + + # Run tests + if [ "$SKIP_TESTS" = false ]; then + run_tests + else + print_info "Skipping tests" + fi + + echo "" + echo "========================================" + print_success "All checks passed! Ready to commit." + echo "========================================" +} + +main "$@"