Skip to content

Switch to PEP 621 project metadata; build sdist and all wheels in CI #201

Switch to PEP 621 project metadata; build sdist and all wheels in CI

Switch to PEP 621 project metadata; build sdist and all wheels in CI #201

Workflow file for this run

name: Python
on:
push:
branches: [main]
tags: ["*"]
pull_request:
branches: [main]
permissions:
contents: read
env:
PYTHONUNBUFFERED: 1
jobs:
pre-commit:
name: Rerun pre-commit checks
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
python-version: '3.12'
- uses: pre-commit/[email protected]
tests:
name: Tests
needs: pre-commit
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
python-version: [3.8, 3.9, "3.10", "3.11", "3.12"]
include:
- os: ubuntu-latest
python-version: "3.12"
sdist: sdist
# Python 3.8 is too old to support universal binaries, and
# setup-python's Python 3.9 and 3.10 won't build them. Use the
# last upstream patch releases that ship with installers.
# https://github.com/actions/setup-python/issues/439#issuecomment-1247646682
- os: macos-latest
python-version: "3.9"
upstream-python: 3.9.13
- os: macos-latest
python-version: "3.10"
upstream-python: 3.10.11
steps:
- name: Check out repo
uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
if: matrix.upstream-python == null
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Set up Python ${{ matrix.python-version }} (macOS fallback)
if: matrix.upstream-python != null
run: |
pkgdir="${{ runner.temp }}/python"
mkdir -p "$pkgdir/bin"
pkg="$pkgdir/python.pkg"
curl -Lfo "$pkg" \
"https://www.python.org/ftp/python/${{ matrix.upstream-python }}/python-${{ matrix.upstream-python }}-macos11.pkg"
sudo installer -pkg "$pkg" -target /
for bin in python pip; do
ln -s /usr/local/bin/${bin}3 $pkgdir/bin/${bin}
done
export PATH="$pkgdir/bin:$PATH"
echo "PATH=$PATH" >> $GITHUB_ENV
python -V
pip -V
- name: Install Python tools
run: |
python -m pip install --upgrade pip
pip install auditwheel build jinja2 pytest setuptools
- name: Install OpenSlide
run: |
case "${{ matrix.os }}" in
ubuntu-latest)
sudo apt-get install libopenslide0
;;
macos-latest)
brew install openslide
;;
esac
- name: Build wheel
run: |
if [ -z "${{ matrix.sdist }}" ]; then
wheel_only=-w
fi
python -m build $wheel_only
case "${{ matrix.os }}" in
ubuntu-*)
mkdir old
mv dist/*.whl old/
auditwheel repair --only-plat -w dist old/*whl
;;
macos-*)
if [ "${{ matrix.python-version }}" != 3.8 -a ! -e dist/*universal2* ]; then
echo "Wheel is not universal:"
ls dist
exit 1
fi
esac
basename=openslide-python-wheels-$GITHUB_RUN_NUMBER-$(echo $GITHUB_SHA | cut -c-10)
mkdir -p "artifacts/${basename}"
mv dist/* "artifacts/${basename}"
echo "basename=${basename}" >> $GITHUB_ENV
- name: Install
run: pip install artifacts/${basename}/*.whl
- name: Run tests
run: pytest -v
- name: Tile slide
run: python examples/deepzoom/deepzoom_tile.py --viewer -o tiled tests/fixtures/small.svs
- name: Archive wheel
uses: actions/upload-artifact@v3
with:
name: ${{ env.basename }}
path: artifacts
windows:
name: Windows
needs: pre-commit
runs-on: windows-latest
env:
BIN_RELEASE: 20231011
defaults:
run:
shell: bash
strategy:
matrix:
python-version: [3.8, 3.9, "3.10", "3.11", "3.12"]
steps:
- name: Check out repo
uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install Python tools
run: |
python -m pip install --upgrade pip
pip install build flask pytest
- name: Install OpenSlide
run: |
mkdir -p c:\\openslide
cd c:\\openslide
zipname=openslide-win64-${BIN_RELEASE}
curl -LfO "https://github.com/openslide/openslide-bin/releases/download/v${BIN_RELEASE}/${zipname}.zip"
7z x ${zipname}.zip
echo "OPENSLIDE_PATH=c:\\openslide\\${zipname}\\bin" >> $GITHUB_ENV
- name: Build wheel
run: |
python -m build -w
basename=openslide-python-wheels-$GITHUB_RUN_NUMBER-$(echo $GITHUB_SHA | cut -c-10)
mkdir -p "artifacts/${basename}"
mv dist/*.whl "artifacts/${basename}"
echo "basename=${basename}" >> $GITHUB_ENV
- name: Install
run: pip install artifacts/${basename}/*.whl
- name: Run tests
# Reads OPENSLIDE_PATH
run: pytest -v
- name: Test library loading in examples
# Reads OPENSLIDE_PATH
run: |
python examples/deepzoom/deepzoom_multiserver.py -h >/dev/null
python examples/deepzoom/deepzoom_server.py -h >/dev/null
python examples/deepzoom/deepzoom_tile.py -h >/dev/null
- name: Tile slide
# Reads OPENSLIDE_PATH
run: python examples/deepzoom/deepzoom_tile.py --viewer -o tiled tests/fixtures/small.svs
- name: Archive wheel
uses: actions/upload-artifact@v3
with:
name: ${{ env.basename }}
path: artifacts
docs:
name: Docs
needs: pre-commit
runs-on: ubuntu-latest
steps:
- name: Check out repo
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.12'
- name: Install Python tools
run: |
python -m pip install --upgrade pip
pip install sphinx
- name: Build
run: |
basename=openslide-python-docs-$GITHUB_RUN_NUMBER-$(echo $GITHUB_SHA | cut -c-10)
sphinx-build -d doctrees doc artifact/${basename}
echo "basename=${basename}" >> $GITHUB_ENV
- name: Archive
uses: actions/upload-artifact@v3
with:
name: ${{ env.basename }}
path: artifact