1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
name: Test
on:
push:
branches: [main]
pull_request:
branches: [main]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
generate-jobs:
name: Generate test matrix
runs-on: ubuntu-latest
outputs:
sessions: ${{ steps.set-matrix.outputs.sessions }}
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v6
with:
enable-cache: true
- name: Install Python
run: uv python install 3.12
- name: Install nox
run: uv tool install nox
- name: Generate test matrix
id: set-matrix
shell: bash
run: |
echo sessions=$(
uvx nox --json -t tests -l |
jq 'map(
{
session,
name: "\( .name ) on \( .python )\( if .call_spec != {} then " (\(.call_spec | to_entries | map("\(.key)=\(.value)") | join(", ")))" else "" end )"
}
)'
) | tee --append $GITHUB_OUTPUT
tests:
name: 🔬 ${{ matrix.session.name }}
needs: generate-jobs
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest]
session: ${{ fromJson(needs.generate-jobs.outputs.sessions) }}
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v6
with:
enable-cache: true
cache-dependency-glob: "uv.lock"
- name: Install Python ${{ matrix.session.python }}
run: uv python install ${{ matrix.session.python }}
- name: Install nox
run: uv tool install nox
- name: Run tests
run: uvx nox -r -t tests -s "${{ matrix.session.session }}"
env:
COVERAGE_FILE: .coverage.${{ matrix.session.session }}.${{ github.run_id }}
- name: Generate artifact name
id: artifact-name
run: |
NAME="${{ matrix.session.name }}"
# Replace spaces with dashes and remove parentheses
SANITIZED=$(echo "$NAME" | tr ' ' '-' | tr -d '()')
echo "name=coverage-data-$SANITIZED" >> $GITHUB_OUTPUT
- name: Upload coverage data
uses: actions/upload-artifact@v4
with:
name: ${{ steps.artifact-name.outputs.name }}
path: |
.coverage
.coverage.*
include-hidden-files: true
if-no-files-found: ignore
coverage:
name: Combine & check coverage
if: always()
needs: tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v6
with:
enable-cache: true
cache-dependency-glob: "uv.lock"
- name: Download coverage data
uses: actions/download-artifact@v4
with:
pattern: coverage-data-*
merge-multiple: true
- name: Install Python
run: uv python install 3.12
- name: Install nox
run: uv tool install nox
- name: Combine coverage & generate report
run: |
uvx nox -s coverage -- --ci
lint:
name: Linting
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v6
with:
enable-cache: true
cache-dependency-glob: "uv.lock"
- name: Install Python
run: uv python install 3.12
- name: Install nox
run: uv tool install nox
- name: Run lint
run: uvx nox -s lint
- name: Run mypy
run: uvx nox -s mypy
|