name: Tests on: push: branches: [ main, development ] pull_request: branches: [ main, development ] jobs: lint: name: Code Quality (Ruff & Mypy) runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python 3.12 uses: actions/setup-python@v5 with: python-version: '3.12' - name: Install dependencies run: | python -m pip install --upgrade pip pip install "ruff==0.15.8" mypy pip install -e . - name: Run ruff linter run: | echo "Running ruff check..." ruff check src/ tests/ --output-format=github - name: Run ruff formatter check run: | echo "Checking code formatting..." ruff format --check src/ tests/ - name: Run mypy type checker run: | echo "Running mypy type checker..." mypy src/skill_seekers --show-error-codes --pretty continue-on-error: true # Don't fail CI on mypy errors initially test: runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest] python-version: ['3.10', '3.11', '3.12'] exclude: # Exclude some combinations to speed up CI - os: macos-latest python-version: '3.10' steps: - uses: actions/checkout@v4 with: submodules: recursive # Initialize api/configs_repo submodule - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install uv run: | curl -LsSf https://astral.sh/uv/install.sh | sh echo "$HOME/.local/bin" >> $GITHUB_PATH - name: Cache pip packages uses: actions/cache@v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt', 'skill_seeker_mcp/requirements.txt') }} restore-keys: | ${{ runner.os }}-pip- - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt if [ -f skill_seeker_mcp/requirements.txt ]; then pip install -r skill_seeker_mcp/requirements.txt; fi # Install package in editable mode for tests (required for src/ layout) pip install -e . - name: Run CLI tests run: | python -m pytest tests/test_scraper_features.py -v python -m pytest tests/test_config_validation.py -v python -m pytest tests/test_integration.py -v - name: Run MCP server tests run: | python -m pytest tests/test_mcp_server.py -v - name: Generate coverage report run: | python -m pytest tests/ --cov=src/skill_seekers --cov-report=xml --cov-report=term - name: Upload coverage to Codecov uses: codecov/codecov-action@v4 with: file: ./coverage.xml flags: unittests name: codecov-umbrella fail_ci_if_error: false # Summary job that provides a single status check for branch protection. # The job name MUST match the required status check in the branch # protection rules. GitHub reports status checks using job names # (not the workflow name), so the required check "Tests" will only # be satisfied if a job with exactly that name exists and succeeds. tests-complete: name: Tests needs: [lint, test] runs-on: ubuntu-latest if: always() steps: - name: Check all results run: | if [ "${{ needs.lint.result }}" != "success" ]; then echo "❌ Code quality checks failed!" exit 1 fi if [ "${{ needs.test.result }}" != "success" ]; then echo "❌ Tests failed!" exit 1 fi echo "✅ All checks passed!"