Skip to content

TST: test CPython 3.13 (free-threading flavor) #605

TST: test CPython 3.13 (free-threading flavor)

TST: test CPython 3.13 (free-threading flavor) #605

Workflow file for this run

name: CI
on:
push:
branches:
- main
pull_request:
schedule:
# run this every Wednesday at 3 am UTC
- cron: 0 3 * * 3
workflow_dispatch:
concurrency:
# auto-cancel any in-progress job *on the same branch*
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build-test:
runs-on: ubuntu-latest
steps:
- name: Checkout Source
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: 3.x
- run: |
python -m pip install --upgrade pip
python -m pip install --upgrade check-manifest
python -m pip install --upgrade build
- name: Check build
run: |
python -m check_manifest
python -m build
unit-tests:
strategy:
matrix:
os:
- ubuntu-latest
python-version:
- '3.10'
- '3.11'
- '3.12'
include:
- os: macos-latest
python-version: '3.12'
- os: windows-latest
python-version: '3.12'
# test with minimal requirements
- os: ubuntu-20.04
python-version: '3.10'
deps: minimal
runs-on: ${{ matrix.os }}
steps:
- name: Checkout Source
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Upgrade pip
run: python -m pip install --upgrade pip
- if: matrix.deps == 'minimal'
run: |
pipx run uv pip compile pyproject.toml --resolution=lowest-direct > mindeps.txt
python -m pip install --requirement mindeps.txt
- name: Build library
# install in editable mode to allow coverage measurement
run: python -m pip install --editable .
- run: python -m pip install --requirement requirements/tests.txt
- run: python -m pip list
- name: Test
run: |
python -m pip list
python -m coverage run --parallel-mode -m pytest --color=yes
- name: Upload coverage data
# only using reports from ubuntu because
# combining reports from multiple platforms is tricky (or impossible ?)
if: matrix.os == 'ubuntu-latest'
uses: actions/upload-artifact@v4
with:
name: gpgi_coverage_data-${{ matrix.os }}-${{ matrix.python-version }}
path: .coverage.*
if-no-files-found: ignore
image-tests:
name: Image tests
runs-on: ubuntu-latest
steps:
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: 3.x
- uses: actions/checkout@v4
- name: Build library
run: |
python -m pip install --upgrade pip
python -m pip install .
- run: python -m pip install --requirement requirements/tests.txt
- name: Run Image Tests
run: |
pytest --color=yes --mpl -m mpl_image_compare \
--mpl-generate-summary=html \
--mpl-results-path=gpgi_pytest_mpl_results \
--mpl-baseline-path=tests/pytest_mpl_baseline
- name: Generate new image baseline
if: failure()
run: |
pytest --color=yes --mpl -m mpl_image_compare \
--mpl-generate-path=gpgi_pytest_mpl_new_baseline \
--last-failed
# always attempt to upload artifacts, even
# (and especially) in case of failure.
- name: Upload pytest-mpl report
if: always()
uses: actions/upload-artifact@v4
with:
name: gpgi_pytest_mpl_results
path: gpgi_pytest_mpl_results/*
- name: Upload pytest-mpl baseline
if: always()
uses: actions/upload-artifact@v4
with:
name: gpgi_pytest_mpl_new_baseline
path: gpgi_pytest_mpl_new_baseline/*
if-no-files-found: ignore
coverage:
name: Combine & check coverage.
runs-on: ubuntu-latest
needs: unit-tests
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
# Use latest Python, so it understands all syntax.
python-version: 3.x
- run: python -m pip install --upgrade coverage[toml]
- uses: actions/download-artifact@v4
with:
pattern: gpgi_coverage_data-*
merge-multiple: true
- name: Check coverage
run: |
python -m coverage combine
python -m coverage html --skip-covered --skip-empty
python -m coverage report --fail-under=100
- name: Upload HTML report if check failed.
uses: actions/upload-artifact@v4
with:
name: gpgi_coverage_report
path: htmlcov
if: ${{ failure() }}
typecheck:
strategy:
matrix:
python-version:
- '3.10'
- '3.12'
runs-on: ubuntu-latest
name: type check
steps:
- name: Checkout repo
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Build
run: |
python -m pip install --upgrade pip
python -m pip install --requirement requirements/typecheck.txt
- name: Typecheck
run: |
python -m pip freeze
mypy src/gpgi
future:
name: 'py${{ matrix.python-version }} (free-threading: ${{ matrix.free-threading }})'
runs-on: ubuntu-latest
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
python-version:
- 3.13-dev
free-threading:
- false
- true
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
if: ${{ !matrix.free-threading }}
with:
python-version: ${{ matrix.python-version }}
- uses: deadsnakes/[email protected]
if: ${{ matrix.free-threading }}
with:
python-version: ${{ matrix.python-version }}
nogil: true
- name: Build
# install numpy from source until there are nightly wheels for 3.13
# at https://pypi.anaconda.org/scientific-python-nightly-wheels/simple,
# or latest sdist (PyPI only) build with free-threading 3.13 (supposedly numpy 2.1.0)
run: |
python -m pip install --upgrade pip
python -m pip install --pre setuptools wheel Cython
python -m pip install git+https://github.com/numpy/numpy.git
python -m pip install . --no-build-isolation
- name: Install minimal test env
run: |
python -m pip install --pre pytest
- run: python -m pip list
- name: Tests
run: pytest --color=yes
create-issue:
if: ${{ failure() && github.event_name == 'schedule' }}
needs: [future]
permissions:
issues: write
runs-on: ubuntu-latest
name: Create issue on failure
steps:
- name: Create issue on failure
uses: imjohnbo/issue-bot@v3
with:
title: 'TST: Upcoming dependency test failures'
body: |
The weekly build with future Python, Cython and numpy
has failed. Check the logs for any updates that need to be
made in gpgi.
https://github.com/${{github.repository}}/actions/runs/${{github.run_id}}
pinned: false
close-previous: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}