USDA-ARS-NWRC/topocalc

View on GitHub
.github/workflows/python-package.yml

Summary

Maintainability
Test Coverage
# 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: Unittest, flake8, coverage

# Run action on pull requests
# Run on a published release and push to Pypi
on:
  pull_request:
    branches: [ main ]
  release: 
    types: [published]

jobs:

  flake8:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: '3.7'
          
      - name: Install dependencies
        run: |
          python3 -m pip install --upgrade pip
          python3 -m pip install flake8

      - name: Lint with flake8
        run: |
          flake8 topocalc

  coverage:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: '3.7'
          
      - name: Install dependencies
        run: |
          python3 -m pip install --upgrade pip
          python3 -m pip install coverage coveralls PyYAML
          python3 -m pip install -r requirements.txt

      - name: Run coverage
        run: |
          make coveralls


  unittest:
    needs: [flake8, coverage]
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest]
        python-version: [3.6, 3.7, 3.8, 3.9]
    runs-on: ${{ matrix.os }}

    steps:
      - uses: actions/checkout@v2

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python-version }}

      - name: Install dependencies
        run: |
          python3 -m pip install --upgrade pip
          python3 -m pip install -r requirements.txt

      - name: Run unittests
        run: |
           python3 setup.py test

  build_wheels:
    needs: unittest
    name: Build wheels on ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-20.04, macos-10.15]

    steps:
      - uses: actions/checkout@v2

      - uses: actions/setup-python@v2
        name: Install Python
        with:
          python-version: '3.8'

      - name: Build wheels
        uses: joerick/cibuildwheel@v1.10.0
        env:
          CIBW_SOME_OPTION: value
          CIBW_TEST_REQUIRES: nose
          CIBW_TEST_COMMAND: "nosetests -vv --exe topocalc"
          CIBW_BUILD: "cp3*-manylinux_x86_64 cp3*-macosx_x86_64"
          CIBW_SKIP: "?p27* pp* ?p35"
          CIBW_BUILD_VERBOSITY: 3
          CIBW_BEFORE_BUILD: "pip install -r requirements.txt"

      - uses: actions/upload-artifact@v2
        with:
          path: ./wheelhouse/*.whl

  build_sdist:
    needs: unittest
    name: Build source distribution
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - uses: actions/setup-python@v2
        name: Install Python
        with:
          python-version: '3.8'

      - name: Install dependencies
        run: |
          python3 -m pip install --upgrade pip
          python3 -m pip install -r requirements.txt

      - name: Build sdist
        run: python setup.py sdist --formats=gztar

      - uses: actions/upload-artifact@v2
        with:
          path: dist/*.tar.gz

  upload_pypi:
    needs: [build_wheels, build_sdist]
    runs-on: ubuntu-latest
    # upload to PyPI on every tag starting with 'v'
    # if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags/v')
    # alternatively, to publish when a GitHub Release is created, use the following rule:
    if: github.event_name == 'release' && github.event.action == 'published'
    steps:
      - uses: actions/download-artifact@v2
        with:
          name: artifact
          path: dist

      - uses: pypa/gh-action-pypi-publish@master
        with:
          user: __token__
          password: ${{ secrets.pypi_password }}
          # To test: repository_url: https://test.pypi.org/legacy/