Skip to content

Feat/modernize

Feat/modernize #195

name: Test, Build and Deploy
on:
push:
branches:
- master
pull_request:
branches:
- master
release:
types: [ published ]
defaults:
run:
shell: bash
jobs:
test-code:
name: Test Code
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ ubuntu-latest, windows-latest, macos-latest ]
python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13' ]
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Setup Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Get pip cache dir
id: pip-cache
run: |
echo "::set-output name=dir::$(pip cache dir)"
- name: pip cache
uses: actions/cache@v4
with:
path: ${{ steps.pip-cache.outputs.dir }}
key: ${{ runner.os }}-pip-${{ hashFiles('build-requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: Install dependencies
if: steps.pip-cache.outputs.cache-hit != 'true'
run: |
python -m pip install --upgrade pip
pip install -r build-requirements.txt
- name: Build and install
run: |
python -m build --wheel --no-isolation
pip install -e .
- name: Test package
run: python -m pytest tests/
- name: Coveralls
if: matrix.python-version == '3.10' && matrix.os == 'ubuntu-latest' && startsWith(github.ref, 'refs/tags/')
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
pip install wheel coveralls
coveralls --service=github
build-sdist:
name: Build SDist (Source)
needs: test-code
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Setup Python 3.10
uses: actions/setup-python@v5
with:
python-version: '3.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install build wheel numpy cython scipy
- name: Package source distribution
run: python -m build sdist sdist
- name: List items
run: |
echo "Listing dist directory"
ls -R dist
- name: Place distribution in artifacts folder
uses: actions/upload-artifact@v4
with:
name: bdist
path: dist/*.tar.gz
if-no-files-found: error
build-wheel:
name: Build wheels on ${{ matrix.os }}
needs: test-code
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ ubuntu-latest, macos-latest, windows-latest ]
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Setup Python 3.10
uses: actions/setup-python@v5
with:
python-version: '3.10'
- name: Install cibuildwheel
run: |
python -m pip install --upgrade pip
pip install cibuildwheel
- name: Build BDist Package
env:
# specify python environments. Skip 32-bit builds
CIBW_BUILD: cp39-* cp310-* cp311-* cp312-* cp313-*
CIBW_SKIP: "*-win32 *-manylinux_i686 *-musllinux_*"
# install dependencies, these are the minimum dependencies for building the wheels
CIBW_BEFORE_BUILD: pip install numpy cython scipy
CIBW_MANYLINUX_X86_64_IMAGE: manylinux2014
run: python -m cibuildwheel --output-dir dist
- name: List items
run: |
echo "Listing dist directory"
ls -R dist
- name: Place wheels in artifacts folder
uses: actions/upload-artifact@v4
with:
name: whl-${{ matrix.os }}
path: dist/*.whl
if-no-files-found: error
# the following step ensures that the package is usable after installing the source files/wheels
# by running a mock import of copulae
install-package:
name: Test package installation
needs: [ build-sdist, build-wheel ]
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ ubuntu-latest, macos-latest, windows-latest ]
python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13' ]
# ext: [ tar.gz, whl ]
ext: [ whl ]
steps:
- name: Setup Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Retrieve packages
uses: actions/download-artifact@v4
with:
path: dist
- name: List items
run: |
echo "Listing current directory"
ls -R
- name: Test Package Installation
run: |
pip install --upgrade pip
# finds path to the right wheel or source file to install later
if [[ "${{ matrix.ext }}" == "whl" ]]; then
os=$(echo ${{ runner.os }} | awk '{print tolower($0)}' | head -c3)
version=$(echo ${{ matrix.python-version }} | sed 's/\.//g')
filename="copulae-*${version}*${os}*.whl"
else
# Following packages are needed to install copulae from source
pip install numpy wheel cython scipy
filename="copulae-*.tar.gz"
fi;
echo "Looking for file ${filename}"
file=$(find dist -name "${filename}" -type f);
pip list
pip install ${file}
# if we can import this, all should be gucci
python -c "import copulae"
deploy-test:
name: Deploy packages to TestPyPI
runs-on: ubuntu-latest
needs: install-package
if: ${{ !startsWith(github.ref, 'refs/tags/') }}
steps:
- name: Setup Python 3.10
uses: actions/setup-python@v5
with:
python-version: '3.10'
- name: Install twine
run: pip install twine
- name: Checkout utilities
uses: actions/checkout@v4
with:
sparse-checkout: |
.github/utils
sparse-checkout-cone-mode: false
- name: Retrieve packages
uses: actions/download-artifact@v4
with:
path: dist
- name: Find and copy packages to files/
run: |
mkdir files
ls -ltR
python .github/utils/find.py -from dist -to files -pattern "(.tar.gz|.whl)$"
- name: Upload packages to testpypi
env:
TWINE_USERNAME: ${{ secrets.PYPI_TEST_TOKEN_NAME }}
TWINE_PASSWORD: ${{ secrets.PYPI_TEST_API_TOKEN }}
run: python -m twine upload --skip-existing --repository testpypi files/* --verbose
deploy:
name: Deploy packages to PyPI
runs-on: ubuntu-latest
needs: install-package
if: startsWith(github.ref, 'refs/tags/')
steps:
- name: Setup Python 3.10
uses: actions/setup-python@v5
with:
python-version: '3.10'
- name: Install twine
run: pip install twine
- name: Checkout utilities
uses: actions/checkout@v4
with:
sparse-checkout: |
.github/utils
sparse-checkout-cone-mode: false
- name: Retrieve packages
uses: actions/download-artifact@v4
with:
path: dist
- name: Find and copy packages to files/
run: |
mkdir files
ls -ltR
python .github/utils/find.py -from dist -to files -pattern "(.tar.gz|.whl)$"
- name: Upload packages to pypi
env:
TWINE_USERNAME: ${{ secrets.PYPI_PROD_TOKEN_NAME }}
TWINE_PASSWORD: ${{ secrets.PYPI_PROD_API_TOKEN }}
run: python -m twine upload --skip-existing files/* --verbose