Feat/modernize #195
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: 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 |