Skip to content

Bump version: 14.6.0-alpha → 14.6.0 #464

Bump version: 14.6.0-alpha → 14.6.0

Bump version: 14.6.0-alpha → 14.6.0 #464

Workflow file for this run

name: CI
on:
push:
branches:
- 'master'
tags: [ 'v*' ]
pull_request:
branches:
- 'master'
defaults:
run:
shell: bash
jobs:
check:
name: Check
runs-on: ubuntu-latest
steps:
- name: 'Checkout'
uses: actions/checkout@v4
- name: 'Setup Rust'
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt,clippy
- name: 'Check Rust metadata'
run: >
cargo metadata --format-version=1 --no-deps
| jq --compact-output --raw-output '.packages[]'
| while read -r package; do
if [[ $(echo "$package" | jq --raw-output ".repository") != '${{ github.server_url }}/${{ github.repository }}' ]]; then
echo "Package $(echo "$package" | jq '.name') has invalid repository URL $(echo "$package" | jq '.repository')";
exit 1;
fi
done
- name: 'Setup Python'
uses: actions/setup-python@v5
with:
python-version: '3.13'
- name: 'Check Python metadata'
run: |
PROJECT_DESCRIPTION=$(python -c 'import json, pathlib, tomllib; print(json.dumps(tomllib.loads(pathlib.Path("pyproject.toml").read_text())))' | jq --raw-output '.project.description')
MODULE_DOCSTRING=$(python -c "import ${REPOSITORY_NAME//-/_} as module; assert module.__doc__ is not None; print(module.__doc__)")
if [[ $PROJECT_DESCRIPTION != "$MODULE_DOCSTRING" ]]; then
echo "Project description should be equal to module docstring, but found \"$PROJECT_DESCRIPTION\" != \"$MODULE_DOCSTRING\".";
exit 1;
fi
env:
REPOSITORY_NAME: ${{ github.event.repository.name }}
- name: 'Install pre-commit'
run: python -m pip install -U pre-commit
- name: 'Run pre-commit'
run: pre-commit run --all-files --hook-stage manual
test:
name: 'Test'
runs-on: ${{ matrix.platform.os }}
strategy:
fail-fast: false
matrix:
python_version: [ '3.9', '3.10', '3.11', '3.12', '3.13' ]
platform: [
{
os: 'macos-latest',
python_architecture: 'x64',
rust_target: 'x86_64-apple-darwin'
},
{
os: 'ubuntu-latest',
python_architecture: 'x64',
rust_target: 'x86_64-unknown-linux-gnu'
},
{
os: 'windows-latest',
python_architecture: 'x64',
rust_target: 'x86_64-pc-windows-msvc'
},
{
os: 'windows-latest',
python_architecture: 'x86',
rust_target: 'i686-pc-windows-msvc'
},
]
exclude:
- python_version: '3.9'
platform: {
os: 'macos-latest',
python_architecture: 'x64',
rust_target: 'x86_64-apple-darwin'
}
- python_version: '3.10'
platform: {
os: 'macos-latest',
python_architecture: 'x64',
rust_target: 'x86_64-apple-darwin'
}
include:
- python_version: '3.9'
platform: {
os: 'macos-13',
python_architecture: 'x64',
rust_target: 'x86_64-apple-darwin'
}
- python_version: '3.10'
platform: {
os: 'macos-13',
python_architecture: 'x64',
rust_target: 'x86_64-apple-darwin'
}
- python_version: 'pypy-3.9'
platform: { os: 'macos-13', python_architecture: 'x64' }
- python_version: 'pypy-3.9'
platform: { os: 'ubuntu-latest', python_architecture: 'x64' }
- python_version: 'pypy-3.9'
platform: { os: 'windows-latest', python_architecture: 'x64' }
- python_version: 'pypy-3.10'
platform: { os: 'macos-13', python_architecture: 'x64' }
- python_version: 'pypy-3.10'
platform: { os: 'ubuntu-latest', python_architecture: 'x64' }
- python_version: 'pypy-3.10'
platform: { os: 'windows-latest', python_architecture: 'x64' }
steps:
- name: 'Checkout'
uses: actions/checkout@v4
- name: 'Setup Python'
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python_version }}
architecture: ${{ matrix.platform.python_architecture }}
- name: 'Setup nightly Rust'
uses: dtolnay/rust-toolchain@master
with:
toolchain: nightly-${{ matrix.platform.rust_target }}
components: llvm-tools
if: ${{ !startsWith(matrix.python_version, 'pypy') }}
- name: 'Setup stable Rust'
uses: dtolnay/rust-toolchain@master
with:
toolchain: stable-${{ matrix.platform.rust_target }}
components: llvm-tools,rustfmt
if: ${{ !startsWith(matrix.python_version, 'pypy') }}
- name: 'Install Rust coverage dependencies'
uses: taiki-e/install-action@cargo-llvm-cov
if: ${{ !startsWith(matrix.python_version, 'pypy') }}
- name: 'Run Rust doctests'
run: |
eval "$(rustup run nightly-${{ matrix.platform.rust_target }} cargo llvm-cov show-env --export-prefix --doctests)"
rustup run nightly-${{ matrix.platform.rust_target }} cargo test --doc
env:
CARGO_INCREMENTAL: 1
if: ${{ !startsWith(matrix.python_version, 'pypy') }}
- name: 'Install in editable mode'
run: |
${{ !startsWith(matrix.python_version, 'pypy') && 'eval "$(cargo llvm-cov show-env --export-prefix)"' || '' }}
${{ !startsWith(matrix.python_version, 'pypy') && 'CARGO_INCREMENTAL=1 CARGO_TARGET_DIR=$CARGO_LLVM_COV_TARGET_DIR' || '' }} python -m pip -v install -e '.[tests]'
- name: 'Install Python coverage dependencies'
run: python -m pip install --upgrade coverage[toml]
- name: 'Run Python doctests'
run: |
${{ !startsWith(matrix.python_version, 'pypy') && 'eval "$(cargo llvm-cov show-env --export-prefix)"' || '' }}
coverage run -m doctest README.md
coverage run --append -m pytest --doctest-modules --ignore=tests
- name: 'Run tests'
run: |
${{ !startsWith(matrix.python_version, 'pypy') && 'eval "$(cargo llvm-cov show-env --export-prefix)"' || '' }}
coverage run --append -m pytest
env:
RUST_BACKTRACE: full
- name: 'Collect Python coverage'
run: coverage xml -o coverage_python.xml
- name: 'Collect Rust coverage'
run: |
eval "$(cargo llvm-cov show-env --export-prefix)"
rustup run nightly-${{ matrix.platform.rust_target }} cargo llvm-cov report --cobertura --branch --output-path coverage_rust.xml
if: ${{ !startsWith(matrix.python_version, 'pypy') }}
- name: 'Upload PyPy coverage'
uses: codecov/codecov-action@v4
with:
fail_ci_if_error: false
files: ./coverage_python.xml
token: ${{ secrets.CODECOV_TOKEN }}
if: ${{ startsWith(matrix.python_version, 'pypy') }}
continue-on-error: true
- name: 'Upload СPython coverage'
uses: codecov/codecov-action@v4
with:
fail_ci_if_error: false
files: ./coverage_python.xml,./coverage_rust.xml
token: ${{ secrets.CODECOV_TOKEN }}
if: ${{ !startsWith(matrix.python_version, 'pypy') }}
continue-on-error: true
pre-deploy:
name: 'Pre-deploy'
runs-on: ubuntu-latest
needs: test
if: github.event_name == 'push' && github.ref_type == 'tag'
steps:
- name: '_'
run: echo "Pre-deploy step"
deploy-crates-io:
name: 'Deploy to crates.io'
environment: release
needs: pre-deploy
runs-on: ubuntu-latest
steps:
- name: 'Checkout'
uses: actions/checkout@v4
- name: 'Setup Rust'
uses: dtolnay/rust-toolchain@stable
- name: 'Upload'
run: cargo publish --no-verify
env:
CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
build-sdist:
name: 'Build sdist'
runs-on: ubuntu-latest
needs: pre-deploy
steps:
- name: 'Checkout'
uses: actions/checkout@v4
- name: 'Setup Python'
uses: actions/setup-python@v5
with:
python-version: '3.13'
- name: 'Install packaging tools'
run: python -m pip install -U build
- name: 'Build sdist'
run: python -m build --sdist
- name: 'Upload sdist'
uses: actions/upload-artifact@v4
with:
name: dist-sdist
path: dist
build-wheels:
name: 'Build wheels'
runs-on: ${{ matrix.platform.os }}
needs: pre-deploy
strategy:
fail-fast: false
matrix:
python_tag: [ 'cp39', 'cp310', 'cp311', 'cp312', 'cp313' ]
platform: [
{
architecture: 'arm64',
os: 'macos-latest',
python_architecture: 'x64',
rust_target: 'aarch64-apple-darwin',
tag: 'macosx_arm64'
},
{
architecture: 'universal2',
os: 'macos-13',
python_architecture: 'x64',
rust_target: 'aarch64-apple-darwin',
tag: 'macosx_universal2'
},
{
architecture: 'x86_64',
os: 'macos-latest',
python_architecture: 'x64',
rust_target: 'x86_64-apple-darwin',
tag: 'macosx_x86_64'
},
{
architecture: 'aarch64',
os: 'ubuntu-latest',
python_architecture: 'x64',
rust_target: 'aarch64-unknown-linux-gnu',
tag: 'manylinux_aarch64'
},
{
architecture: 'aarch64',
os: 'ubuntu-latest',
python_architecture: 'x64',
rust_target: 'aarch64-unknown-linux-musl',
tag: 'musllinux_aarch64'
},
{
architecture: 'i686',
os: 'ubuntu-latest',
python_architecture: 'x64',
rust_target: 'i686-unknown-linux-gnu',
tag: 'manylinux_i686'
},
{
architecture: 'ppc64le',
os: 'ubuntu-latest',
python_architecture: 'x64',
rust_target: 'powerpc64le-unknown-linux-gnu',
tag: 'manylinux_ppc64le'
},
{
architecture: 's390x',
os: 'ubuntu-latest',
python_architecture: 'x64',
rust_target: 's390x-unknown-linux-gnu',
tag: 'manylinux_s390x'
},
{
architecture: 'x86_64',
os: 'ubuntu-latest',
python_architecture: 'x64',
rust_target: 'x86_64-unknown-linux-gnu',
tag: 'manylinux_x86_64'
},
{
architecture: 'x86_64',
os: 'ubuntu-latest',
python_architecture: 'x64',
rust_target: 'x86_64-unknown-linux-musl',
tag: 'musllinux_x86_64'
},
{
architecture: 'AMD64',
os: 'windows-latest',
python_architecture: 'x64',
rust_target: 'x86_64-pc-windows-msvc',
tag: 'win_amd64'
},
{
architecture: 'x86',
os: 'windows-latest',
python_architecture: 'x86',
rust_target: 'i686-pc-windows-msvc',
tag: 'win32'
},
]
steps:
- name: 'Checkout'
uses: actions/checkout@v4
- name: 'Setup Rust'
uses: dtolnay/rust-toolchain@stable
with:
target: ${{ matrix.platform.rust_target }}
if: ${{ runner.os != 'Linux' }}
- name: 'Setup QEMU'
uses: docker/setup-qemu-action@v3
with:
platforms: all
if: ${{ runner.os == 'Linux' }}
- name: 'Build wheels'
uses: pypa/cibuildwheel@v2.21.3
env:
CIBW_ARCHS: ${{ matrix.platform.architecture }}
CIBW_BEFORE_ALL_LINUX: |
curl https://sh.rustup.rs -sSf |
sh -s -- -y --default-toolchain=nightly &&
# caused by https://github.com/rust-lang/cargo/issues/9167
cat > ~/.cargo/config.toml <<EOF
[net]
git-fetch-with-cli = true
EOF
CIBW_BUILD: ${{ matrix.python_tag }}-${{ matrix.platform.tag }}
CIBW_BUILD_VERBOSITY: 1
CIBW_ENVIRONMENT_LINUX: PATH="$HOME/.cargo/bin:$PATH"
- name: 'Upload wheels'
uses: actions/upload-artifact@v4
with:
name: dist-wheels-${{ matrix.python_tag }}-${{ matrix.platform.tag }}
path: wheelhouse/*.whl
test-distributions:
name: 'Test distributions'
runs-on: ${{ matrix.platform.os }}
needs: [ build-sdist, build-wheels ]
strategy:
matrix:
python_version: [ '3.9', '3.10', '3.11', '3.12', '3.13' ]
platform: [
{
os: 'macos-latest',
python_architecture: 'x64'
},
{
os: 'ubuntu-latest',
python_architecture: 'x64'
},
{
os: 'windows-latest',
python_architecture: 'x64'
},
{
os: 'windows-latest',
python_architecture: 'x86'
},
]
exclude:
- python_version: '3.9'
platform: { os: 'macos-latest', python_architecture: 'x64' }
- python_version: '3.10'
platform: { os: 'macos-latest', python_architecture: 'x64' }
include:
- python_version: '3.9'
platform: { os: 'macos-13', python_architecture: 'x64' }
- python_version: '3.10'
platform: { os: 'macos-13', python_architecture: 'x64' }
- python_version: 'pypy-3.9'
platform: { os: 'macos-13', python_architecture: 'x64' }
- python_version: 'pypy-3.9'
platform: { os: 'ubuntu-latest', python_architecture: 'x64' }
- python_version: 'pypy-3.9'
platform: { os: 'windows-latest', python_architecture: 'x64' }
- python_version: 'pypy-3.10'
platform: { os: 'macos-13', python_architecture: 'x64' }
- python_version: 'pypy-3.10'
platform: { os: 'ubuntu-latest', python_architecture: 'x64' }
- python_version: 'pypy-3.10'
platform: { os: 'windows-latest', python_architecture: 'x64' }
steps:
- name: 'Setup Python'
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python_version }}
architecture: ${{ matrix.platform.python_architecture }}
- name: 'Download distributions'
uses: actions/download-artifact@v4
with:
merge-multiple: true
path: dist
pattern: dist-*
- name: 'Install from distributions'
run: >
python -m pip install --find-links=dist --no-deps
"${REPOSITORY_NAME//-/_}"
env:
REPOSITORY_NAME: ${{ github.event.repository.name }}
deploy-pypi:
name: 'Deploy to PyPI'
environment: release
needs: test-distributions
runs-on: ubuntu-latest
steps:
- name: 'Download distributions'
uses: actions/download-artifact@v4
with:
merge-multiple: true
path: dist
pattern: dist-*
- name: 'Upload'
uses: pypa/gh-action-pypi-publish@v1.11.0
with:
packages-dir: dist
password: ${{ secrets.PYPI_API_TOKEN }}