Skip to content

TST: reintroduce coverage measurement and improve coverage to 100% (e… #557

TST: reintroduce coverage measurement and improve coverage to 100% (e…

TST: reintroduce coverage measurement and improve coverage to 100% (e… #557

Workflow file for this run

# This workflow will install Python dependencies, run tests and lint with a variety of Python versions
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
name: Test
on:
push:
branches:
- master
tags: v*
pull_request:
schedule:
# run this on first day of the month at 3 am UTC
- cron: 0 3 1 * *
workflow_dispatch:
jobs:
build:
name: ${{ matrix.os }}, Python ${{ matrix.python-version }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
- ubuntu-latest
- macos-latest
python-version:
- '3.10'
- '3.11'
- '3.12'
- '3.13'
test-args: [viscm>=0.10]
venv-loc: [bin]
include:
- os: ubuntu-20.04
python-version: '3.10'
venv-loc: bin
install-args: --resolution=lowest-direct
- os: windows-latest
python-version: '3.10'
venv-loc: Scripts
- os: windows-latest
python-version: '3.11'
venv-loc: Scripts
- os: windows-latest
python-version: '3.12'
venv-loc: Scripts
- os: windows-latest
python-version: '3.13'
venv-loc: Scripts
concurrency:
group: ${{ github.ref }}-${{ matrix.os }}-${{ matrix.python-version }}-build
cancel-in-progress: true
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v2
with:
enable-cache: true
- name: Build
run: |
uv venv --python ${{ matrix.python-version }}
uv pip install -e . ${{ matrix.install-args }}
uv pip install -r requirements/dev.txt ${{ matrix.test-args }}
- run: uv pip list
- name: Test package (no coverage)
if: ${{ !startsWith( matrix.os , 'ubuntu' ) }}
shell: bash # for windows-compat
run: |
source .venv/${{matrix.venv-loc}}/activate
pytest --color=yes --mpl
- name: Test package (with coverage)
if: startsWith( matrix.os , 'ubuntu' )
run: |
source .venv/${{matrix.venv-loc}}/activate
coverage run --parallel-mode -m pytest --color=yes --mpl
- name: Upload coverage data
# only using reports from ubuntu because
# combining reports from multiple platforms is tricky (or impossible ?)
if: startsWith( matrix.os , 'ubuntu' )
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
with:
name: cmasher_coverage_data-${{ matrix.os }}-${{ matrix.python-version }}
path: .coverage.*
if-no-files-found: ignore
include-hidden-files: true
coverage:
name: Combine & check coverage
runs-on: ubuntu-latest
needs: build
steps:
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
- uses: astral-sh/setup-uv@3b9817b1bf26186f03ab8277bab9b827ea5cc254 # v3.2.0
- run: | # uv sync --only-group covcheck
uv venv
uv pip install . -r requirements/dev.txt
- uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8
with:
pattern: cmasher_coverage_data-*
merge-multiple: true
- name: Check coverage
run: |
uv run coverage combine
uv run coverage html --skip-covered --skip-empty
uv run coverage report --fail-under=100
- name: Upload HTML report if check failed.
uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
with:
name: cmasher_coverage_report
path: htmlcov
if: ${{ failure() }}
type-check:
name: type check w/ Python ${{ matrix.python-version }}
strategy:
matrix:
python-version:
- '3.10'
- '3.13'
runs-on: ubuntu-latest
concurrency:
group: ${{ github.ref }}-${{ matrix.python-version }}-typecheck
cancel-in-progress: true
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v2
with:
enable-cache: true
- name: Run mypy
run: |
uvx --python ${{ matrix.python-version }} \
--with-requirements=requirements/typecheck.txt --with . \
mypy src/cmasher
docs:
name: Build docs
runs-on: ubuntu-latest
concurrency:
group: ${{ github.ref }}-docs
cancel-in-progress: true
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v2
with:
enable-cache: true
- name: Build
run: |
uvx --python 3.12 --with-requirements=requirements/docs.txt --from sphinx \
sphinx-build -M html docs/source site -W
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: site
path: site
check-manifest:
name: Check MANIFEST.in
runs-on: ubuntu-latest
concurrency:
group: ${{ github.ref }}-check_manifest
cancel-in-progress: true
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v2
with:
enable-cache: true
- run: uvx check-manifest
build-artifacts:
name: Build artifacts
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v2
with:
enable-cache: true
- run: uv build
- run: uvx twine check dist/*
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: dist
path: dist
publish:
name: Publish to PyPI
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
needs:
- build
- type-check
- docs
- check-manifest
- build-artifacts
runs-on: ubuntu-latest
environment:
name: pypi
url: https://pypi.org/p/CMasher
permissions:
id-token: write
steps:
- uses: actions/download-artifact@v4
with:
name: dist
path: dist
- name: Publish package distributions to PyPI
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
uses: pypa/gh-action-pypi-publish@release/v1