name: CI - Lint, Test & Coverage on: push: branches: [ main, development, 'feature/**' ] pull_request: branches: [ main, development ] jobs: lint: name: Lint (ruff & flake8) runs-on: ubuntu-latest steps: - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4 - name: Set up Python uses: actions/setup-python@7f4fc3e22c37d6ff65e88745f38bd3157c663f7c # v4 with: python-version: '3.12' - name: Cache pip uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt') }} restore-keys: | ${{ runner.os }}-pip- - name: Install dev dependencies run: | python -m pip install --upgrade pip pip install -r requirements.dev.txt - name: Run pre-commit run: | pre-commit run --all-files - name: Run ruff run: | ruff check . - name: Run flake8 run: | flake8 . || true test-and-coverage: name: Tests & Coverage runs-on: ubuntu-latest needs: [lint] steps: - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4 - name: Set up Python uses: actions/setup-python@7f4fc3e22c37d6ff65e88745f38bd3157c663f7c # v4 with: python-version: '3.12' - name: Cache pip uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt') }} restore-keys: | ${{ runner.os }}-pip- - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt || true pip install -r requirements.dev.txt - name: Run tests with coverage run: | # run pytest under coverage and fail if tests fail coverage run -m pytest -q coverage report -m --fail-under=75 - name: Upload coverage to Codecov uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 # v4 with: fail_ci_if_error: false # Note: Add CODECOV_TOKEN to repo secrets if upload fails or for private repos