MNT: migrate requirement files to PEP 735 dependency groups #978
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 | |
- uses: astral-sh/setup-uv@77c28f02b3322332d4a4446b3177f426da8bf086 # v3.1.5 | |
- name: Check build | |
run: | | |
uvx check-manifest | |
uv build | |
unit-tests: | |
name: ${{matrix.os}} x py${{matrix.python-version}} ${{matrix.marker}} | |
strategy: | |
fail-fast: false | |
matrix: | |
os: | |
- ubuntu-latest | |
python-version: | |
- '3.11' | |
- '3.12' | |
- '3.13' | |
marker: [''] # needed to avoid collision with PY_LIB job | |
include: | |
- os: macos-latest | |
python-version: '3.13' | |
- os: windows-latest | |
python-version: '3.13' | |
# test with minimal requirements | |
- marker: minimal | |
os: ubuntu-20.04 | |
python-version: '3.11' | |
install-args: --resolution=lowest-direct | |
# test GPGI_PY_LIB | |
- marker: PY_LIB | |
os: ubuntu-latest | |
python-version: '3.13' | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Checkout Source | |
uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 | |
- name: Setup Python | |
uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 | |
with: | |
python-version: ${{ matrix.python-version }} | |
- uses: astral-sh/setup-uv@77c28f02b3322332d4a4446b3177f426da8bf086 # v3.1.5 | |
with: | |
enable-cache: true | |
cache-dependency-glob: | | |
**/pyproject.toml | |
- run: echo $(pwd) # TODO: clean up (maybe use it on other archs first) | |
if: matrix.os == 'ubuntu-latest' | |
- name: Test | |
env: | |
GPGI_PY_LIB: ${{ matrix.marker == 'PY_LIB' }} | |
shell: bash # for windows-compat (using `\` as a line continuation) | |
run: | | |
uv sync --only-group test --only-group covcheck --no-build ${{ matrix.install-args }} | |
uv run ${{ matrix.install-args }} \ | |
coverage run --parallel-mode -m pytest --color=yes -ra | |
- 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@84480863f228bb9747b473957fcc9e309aa96097 # v4.4.2 | |
with: | |
name: gpgi_coverage_data-${{matrix.os}}-${{matrix.python-version}}-${{matrix.marker}} | |
path: .coverage.* | |
if-no-files-found: ignore | |
include-hidden-files: true | |
image-tests: | |
name: Image tests | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 | |
- uses: astral-sh/setup-uv@77c28f02b3322332d4a4446b3177f426da8bf086 # v3.1.5 | |
with: | |
enable-cache: true | |
cache-dependency-glob: | | |
**/pyproject.toml | |
- run: uv python install 3.13 | |
- name: Run Image Tests | |
run: | | |
uv sync --only-group test --no-build | |
uv 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: | | |
uv sync --only-group test --no-build | |
uv 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@84480863f228bb9747b473957fcc9e309aa96097 # v4.4.2 | |
with: | |
name: gpgi_pytest_mpl_results | |
path: gpgi_pytest_mpl_results/* | |
- name: Upload pytest-mpl baseline | |
if: always() | |
uses: actions/upload-artifact@84480863f228bb9747b473957fcc9e309aa96097 # v4.4.2 | |
with: | |
name: gpgi_pytest_mpl_new_baseline | |
path: gpgi_pytest_mpl_new_baseline/* | |
if-no-files-found: ignore | |
concurrency-tests: | |
name: Thread concurrency tests | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 | |
- uses: astral-sh/setup-uv@77c28f02b3322332d4a4446b3177f426da8bf086 # v3.1.5 | |
with: | |
enable-cache: true | |
cache-dependency-glob: | | |
**/pyproject.toml | |
- run: uv python install 3.13 | |
- name: Run Concurrency Tests | |
run: | | |
uv sync --only-group test --only-group concurrency --no-build | |
uv run \ | |
pytest --color=yes --count 500 tests/test_concurrent.py | |
coverage: | |
name: Combine & check coverage. | |
runs-on: ubuntu-latest | |
needs: unit-tests | |
steps: | |
- uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 | |
- uses: astral-sh/setup-uv@77c28f02b3322332d4a4446b3177f426da8bf086 # v3.1.5 | |
- run: uv python install 3.13 | |
- uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 | |
with: | |
pattern: gpgi_coverage_data-* | |
merge-multiple: true | |
- name: Check coverage | |
run: | | |
uv tool install coverage | |
coverage combine | |
coverage html --skip-covered --skip-empty | |
coverage report --fail-under=100 # >> $GITHUB_STEP_SUMMARY | |
- name: Upload HTML report if check failed. | |
uses: actions/upload-artifact@84480863f228bb9747b473957fcc9e309aa96097 # v4.4.2 | |
with: | |
name: gpgi_coverage_report | |
path: htmlcov | |
if: ${{ failure() }} | |
typecheck: | |
strategy: | |
matrix: | |
python-version: | |
- '3.11' | |
- '3.12' | |
- '3.13' | |
runs-on: ubuntu-latest | |
name: type check | |
steps: | |
- name: Checkout repo | |
uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 | |
- uses: astral-sh/setup-uv@77c28f02b3322332d4a4446b3177f426da8bf086 # v3.1.5 | |
with: | |
enable-cache: true | |
cache-dependency-glob: | | |
**/pyproject.toml | |
- run: uv python install ${{ matrix.python-version }} | |
- name: Typecheck | |
run: | | |
uv sync --only-group typecheck --no-build | |
uv run mypy src/gpgi | |
future: | |
name: free-threading Python 3.13 | |
runs-on: ubuntu-latest | |
timeout-minutes: 20 | |
steps: | |
- uses: actions/checkout@eef61447b9ff4aafe5dcd4e0bbf5d482be7e7871 # v4.2.1 | |
- uses: deadsnakes/action@e640ac8743173a67cca4d7d77cd837e514bf98e8 # v3.2.0 | |
with: | |
python-version: 3.13 | |
nogil: true | |
- name: Build | |
# not using uv here because it doesn't currently (0.2.33) detect python3.13t as | |
# the active interpreter, and may instead see 3.10, which is not supported in gpgi | |
run: | | |
python -m pip install -U pip | |
python -m pip install --pre setuptools wheel | |
python -m pip install --pre numpy Cython \ | |
--only-binary ':all:' \ | |
--extra-index-url \ | |
https://pypi.anaconda.org/scientific-python-nightly-wheels/simple | |
python -m pip install . --no-build-isolation --no-deps | |
- name: Install minimal test env | |
run: python -m pip install --pre pytest pytest-repeat | |
- run: python -m pip list | |
- name: Tests | |
run: | | |
pytest --color=yes | |
pytest --color=yes --count 500 tests/test_concurrent.py | |
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@572eed14422c4d6ca37e870f97e7da209422f5bd # v3.4.4 | |
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 }} |