name: CI on: push: branches: [main] pull_request: branches: [main] permissions: contents: read concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: lint: name: Lint (Ruff) runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - name: Install uv uses: astral-sh/setup-uv@v7 - name: Set up Python run: uv python install 3.13 - name: Install dependencies run: uv sync --group dev - name: Run Ruff linter run: uv run ruff check . - name: Run Ruff formatter check run: uv run ruff format --check . typecheck: name: Type Check (ty) runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - name: Install uv uses: astral-sh/setup-uv@v7 - name: Set up Python run: uv python install 3.13 - name: Install dependencies run: uv sync --group dev - name: Run ty run: uv run ty check test: name: Test (Python ${{ matrix.python-version }}) runs-on: ubuntu-latest strategy: fail-fast: false matrix: python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] steps: - uses: actions/checkout@v7 - name: Install uv uses: astral-sh/setup-uv@v7 - name: Set up Python ${{ matrix.python-version }} run: uv python install ${{ matrix.python-version }} - name: Install dependencies run: uv sync --group dev - name: Run unit tests with coverage run: uv run pytest -m "not integration" --cov --cov-report=xml --cov-report=term-missing --junitxml=junit.xml -o junit_family=legacy - name: Upload coverage to Codecov if: matrix.python-version == '3.14' uses: codecov/codecov-action@v7 with: token: ${{ secrets.CODECOV_TOKEN }} report_type: coverage files: ./coverage.xml fail_ci_if_error: false - name: Upload test results to Codecov if: matrix.python-version == '3.14' uses: codecov/codecov-action@v7 with: token: ${{ secrets.CODECOV_TOKEN }} report_type: test_results test-integration: name: Integration (${{ matrix.backend.name }}) runs-on: ubuntu-latest strategy: fail-fast: false matrix: backend: - { name: redis, image: "redis:7" } - { name: valkey, image: "valkey/valkey:8" } services: store: image: ${{ matrix.backend.image }} ports: - 6379:6379 options: >- --health-cmd "redis-cli ping" --health-interval 5s --health-timeout 3s --health-retries 5 steps: - uses: actions/checkout@v7 - name: Install uv uses: astral-sh/setup-uv@v7 - name: Set up Python run: uv python install 3.13 - name: Install dependencies run: uv sync --group dev - name: Run integration tests run: uv run pytest -m integration -v