Skip to content

build: switch to uv #620

build: switch to uv

build: switch to uv #620

Workflow file for this run

name: CI
on:
pull_request:
push:
branches: [main]
jobs:
mypy:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13']
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: ./.github/actions/setup
with:
python-version: ${{matrix.python-version}}
- run: uvx hatch run +py=${{matrix.python-version}} types:check
test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13', pypy3.9, pypy3.10]
os: [ubuntu-latest, windows-latest, macos-13]
extra_deps: ['"--with=pytest==8.3.3" "--with=pydantic<2"', '"--with=pytest>=8.3.4" "--with=pydantic>2"']
env:
TOP: ${{github.workspace}}
COVERAGE_PROCESS_START: ${{github.workspace}}/pyproject.toml
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: ./.github/actions/setup
with:
python-version: ${{matrix.python-version}}
- run: |
uv run ${{matrix.extra_deps}} -m ${{ matrix.os == 'ubuntu-latest' && 'coverage run -m' || '' }} pytest -n=auto
- run: |
uv run -m coverage combine
mv .coverage .coverage.${{ matrix.python-version }}-${{matrix.os}}-${{strategy.job-index}}
if: matrix.os == 'ubuntu-latest'
- name: Upload coverage data
uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0
with:
name: coverage-data-${{ matrix.python-version }}-${{matrix.os}}-${{strategy.job-index}}
path: .coverage.*
include-hidden-files: true
if-no-files-found: ignore
coverage:
name: Combine & check coverage
env:
TOP: ${{github.workspace}}
if: always()
needs: test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: ./.github/actions/setup
- uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
pattern: coverage-data-*
merge-multiple: true
- name: Combine coverage & fail if it's <100%
run: |
uv pip install --upgrade coverage[toml]
coverage combine
coverage html --skip-covered --skip-empty
# Report and write to summary.
coverage report --format=markdown >> $GITHUB_STEP_SUMMARY
# Report again and fail if under 100%.
coverage report --fail-under=100
- name: Upload HTML report if check failed
uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0
with:
name: html-report
path: htmlcov
if: ${{ failure() }}
publish:
name: Publish new release
runs-on: ubuntu-latest
needs: [test, coverage]
permissions:
# IMPORTANT: this permission is mandatory for Trusted Publishing
id-token: write
# this permission is mandatory to create github releases
contents: write
steps:
- name: Checkout main
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0
- uses: ./.github/actions/setup
- name: Check if the commit has a vx.y.z tag
id: check-version
run: |
if git tag --list --points-at ${{ github.sha }} | grep -q -E '^v[0-9]+\.[0-9]+\.[0-9]+$'; then
echo "is new version"
echo "should_continue=true" >> "$GITHUB_OUTPUT"
else
echo "is not a new version"
echo "should_continue=false" >> "$GITHUB_OUTPUT"
fi
- run: uv pip install hatch scriv
- name: build package
run: hatch build
- name: Publish package distributions to PyPI
if: ${{ steps.check-version.outputs.should_continue == 'true' }}
uses: pypa/gh-action-pypi-publish@67339c736fd9354cd4f8cb0b744f2b82a74b5c70 # v1.12.3
- name: create github release
if: ${{ steps.check-version.outputs.should_continue == 'true' }}
env:
GITHUB_TOKEN: ${{ github.token }}
run: scriv github-release