Skip to content

Branding: Update NLR branding (#431) #1454

Branding: Update NLR branding (#431)

Branding: Update NLR branding (#431) #1454

Workflow file for this run

name: Py 3.10, 3.11, 3.12 | Windows Mac Linux
on:
pull_request:
branches:
- main
- develop
push:
branches:
- main
- develop
jobs:
set-os:
runs-on: ubuntu-latest
outputs:
matrix_os: ${{ steps.set-matrix.outputs.matrix_os }}
steps:
- id: set-matrix
run: |
if [[ "${{ github.event_name }}" == "pull_request" && "${{ github.base_ref }}" == "develop" ]]; then
echo "matrix_os=[ \"ubuntu-latest\"]" >> $GITHUB_OUTPUT
else
echo "matrix_os=[\"windows-latest\", \"ubuntu-latest\", \"macos-latest\"]" >> $GITHUB_OUTPUT
fi
check-changes:
runs-on: ubuntu-latest
outputs:
wave_io_hindcast_changed: ${{ steps.changes.outputs.wave_io_hindcast }}
should-run-hindcast: ${{ steps.hindcast-logic.outputs.should-run-hindcast }}
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Check for changes in wave/io/hindcast
id: changes
uses: dorny/paths-filter@v3
with:
filters: |
wave_io_hindcast:
- 'mhkit/wave/io/hindcast/**'
- 'mhkit/tests/wave/io/hindcast/**'
- id: hindcast-logic
run: |
if [[ "${{ github.event.pull_request.base.ref }}" == "main" || "${{ steps.changes.outputs.wave_io_hindcast }}" == "true" ]]; then
echo "should-run-hindcast=true" >> "$GITHUB_OUTPUT"
else
echo "should-run-hindcast=false" >> "$GITHUB_OUTPUT"
fi
prepare-nonhindcast-cache:
runs-on: ubuntu-latest
env:
PYTHON_VER: 3.11
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Miniconda
uses: conda-incubator/setup-miniconda@v3
with:
miniconda-version: 'latest'
auto-update-conda: true
python-version: ${{ env.PYTHON_VER }}
activate-environment: TESTconda
use-only-tar-bz2: false
- name: Create MHKiT Conda environment
shell: bash -l {0}
run: |
conda env create -f environment.yml
conda activate mhkit-env
- name: Install testing dependencies
shell: bash -l {0}
run: |
conda activate mhkit-env
conda install -y pytest coverage coveralls
- name: Install mhkit
shell: bash -l {0}
run: |
conda activate mhkit-env
pip install -e ".[all,dev]" --no-deps
- name: Prepare non-hindcast API data
shell: bash -l {0}
run: |
conda activate mhkit-env
pytest mhkit/tests/river/test_io_usgs.py
pytest mhkit/tests/tidal/test_io.py
pytest mhkit/tests/wave/io/test_cdip.py
- name: Upload data as artifact
uses: actions/upload-artifact@v4
with:
name: data
path: ~/.cache/mhkit
prepare-wave-hindcast-cache:
needs: [check-changes]
runs-on: ubuntu-latest
env:
PYTHON_VER: 3.11
if: (needs.check-changes.outputs.should-run-hindcast == 'true')
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Miniconda
uses: conda-incubator/setup-miniconda@v3
with:
miniconda-version: 'latest'
auto-update-conda: true
activate-environment: TEST
python-version: ${{ env.PYTHON_VER }}
use-only-tar-bz2: false
- name: Create MHKiT Conda environment
shell: bash -l {0}
run: |
conda env create -f environment.yml
conda activate mhkit-env
- name: Install testing dependencies
shell: bash -l {0}
run: |
conda activate mhkit-env
conda install -y pytest coverage coveralls
- name: Install mhkit
shell: bash -l {0}
run: |
conda activate mhkit-env
pip install -e ".[all,dev]" --no-deps
- name: Prepare Wave Hindcast data
shell: bash -l {0}
run: |
conda activate mhkit-env
pytest mhkit/tests/wave/io/hindcast/test_hindcast.py
- name: Upload Wave Hindcast data as artifact
uses: actions/upload-artifact@v4
with:
name: wave-hindcast-data
path: ~/.cache/mhkit
prepare-wind-hindcast-cache:
needs: [check-changes, prepare-wave-hindcast-cache]
runs-on: ubuntu-latest
env:
PYTHON_VER: 3.11
if: (needs.check-changes.outputs.should-run-hindcast == 'true')
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Miniconda
uses: conda-incubator/setup-miniconda@v3
with:
miniconda-version: 'latest'
auto-update-conda: true
activate-environment: TEST
python-version: ${{ env.PYTHON_VER }}
use-only-tar-bz2: false
- name: Create MHKiT Conda environment
shell: bash -l {0}
run: |
conda env create -f environment.yml
conda activate mhkit-env
- name: Install testing dependencies
shell: bash -l {0}
run: |
conda activate mhkit-env
conda install -y pytest coverage coveralls
- name: Install mhkit
shell: bash -l {0}
run: |
conda activate mhkit-env
pip install -e ".[all,dev]" --no-deps
- name: Prepare Wind Hindcast data
shell: bash -l {0}
run: |
conda activate mhkit-env
pytest mhkit/tests/wave/io/hindcast/test_wind_toolkit.py
- name: Upload Wind Hindcast data as artifact
uses: actions/upload-artifact@v4
with:
name: wind-hindcast-data
path: ~/.cache/mhkit
conda-build:
name: conda-${{ matrix.os }}/${{ matrix.python-version }}
needs: [set-os, prepare-nonhindcast-cache]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: ${{fromJson(needs.set-os.outputs.matrix_os)}}
python-version: ['3.10', '3.11', '3.12']
env:
PYTHON_VER: ${{ matrix.python-version }}
steps:
- uses: actions/checkout@v4
- name: Setup Miniconda
uses: conda-incubator/setup-miniconda@v3
with:
miniconda-version: 'latest'
auto-update-conda: true
environment-file: environment.yml
activate-environment: TEST
python-version: ${{ matrix.python-version }}
use-only-tar-bz2: false
- name: Create MHKiT Conda environment
shell: bash -l {0}
run: |
conda env create -f environment.yml
conda activate mhkit-env
- name: Install testing dependencies
shell: bash -l {0}
run: |
conda activate mhkit-env
conda install -y pytest coverage coveralls
- name: Install mhkit
shell: bash -l {0}
run: |
conda activate mhkit-env
pip install -e . --no-deps
- name: Run pytest & generate coverage report
shell: bash -l {0}
run: |
conda activate mhkit-env
coverage run --rcfile=.github/workflows/.coveragerc --source=./mhkit/ -m pytest -c .github/workflows/pytest.ini
coverage lcov
- name: Upload coverage data to coveralls.io
uses: coverallsapp/github-action@master
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
flag-name: conda-${{ runner.os }}-py${{ matrix.python-version }}
parallel: true
path-to-lcov: ./coverage.lcov
pip-build:
name: pip-${{ matrix.os }}/${{ matrix.python-version }}
needs: [set-os, prepare-nonhindcast-cache]
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: ${{fromJson(needs.set-os.outputs.matrix_os)}}
python-version: ['3.10', '3.11', '3.12']
steps:
- uses: conda-incubator/setup-miniconda@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Set up Git repository
uses: actions/checkout@v4
- name: Download data from artifact
uses: actions/download-artifact@v4
with:
name: data
path: ~/.cache/mhkit
- name: Install system dependencies
if: runner.os == 'Linux'
run: sudo apt-get install -y libhdf5-dev libnetcdf-dev
- name: Update and install packages
shell: bash -l {0}
run: |
python -m pip install --upgrade pip wheel
pip install -e ".[all,dev]"
- name: Reinstall h5py and netCDF4 with system libraries
if: runner.os == 'Linux'
run: "pip install --force-reinstall --no-binary=:all: h5py netCDF4"
- name: Install setuptools for Python 3.12
if: matrix.python-version == '3.12'
run: pip install setuptools
- name: Run pytest & generate coverage report
shell: bash -l {0}
run: |
coverage run --rcfile=.github/workflows/.coveragerc --source=./mhkit/ -m pytest -c .github/workflows/pytest.ini
coverage lcov
- name: Upload coverage data to coveralls.io
uses: coverallsapp/github-action@master
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
flag-name: pip-${{ runner.os }}-py${{ matrix.python-version }}
parallel: true
path-to-lcov: ./coverage.lcov
hindcast-calls:
name: hindcast-${{ matrix.os }}/${{ matrix.python-version }}
needs:
[
check-changes,
prepare-wave-hindcast-cache,
prepare-wind-hindcast-cache,
set-os,
]
if: (needs.check-changes.outputs.should-run-hindcast == 'true')
runs-on: ${{ matrix.os }}
strategy:
max-parallel: 1
fail-fast: false
matrix:
os: ${{fromJson(needs.set-os.outputs.matrix_os)}}
python-version: ['3.10', '3.11', '3.12']
steps:
- uses: actions/checkout@v4
- name: Setup Miniconda
uses: conda-incubator/setup-miniconda@v3
with:
miniconda-version: 'latest'
auto-update-conda: true
environment-file: environment.yml
activate-environment: TEST
python-version: ${{ matrix.python-version }}
use-only-tar-bz2: false
- name: Create MHKiT Conda environment
shell: bash -l {0}
run: |
conda env create -f environment.yml
conda activate mhkit-env
- name: Install testing dependencies
shell: bash -l {0}
run: |
conda activate mhkit-env
conda install -y pytest coverage coveralls
- name: Install mhkit
shell: bash -l {0}
run: |
conda activate mhkit-env
pip install -e ".[all,dev]" --no-deps
- name: Download Wave Hindcast data from artifact
uses: actions/download-artifact@v4
with:
name: wave-hindcast-data
path: ~/.cache/mhkit/wave-hindcast
- name: Download Wind Hindcast data from artifact
uses: actions/download-artifact@v4
with:
name: wind-hindcast-data
path: ~/.cache/mhkit/wind-hindcast
- name: Consolidate hindcast data
run: |
mkdir -p ~/.cache/mhkit/hindcast
mv ~/.cache/mhkit/wave-hindcast/hindcast/* ~/.cache/mhkit/hindcast/
mv ~/.cache/mhkit/wind-hindcast/hindcast/* ~/.cache/mhkit/hindcast/
shell: bash
- name: Run hindcast pytest
shell: bash -l {0}
run: |
conda activate mhkit-env
coverage run --rcfile=.github/workflows/.coveragehindcastrc -m pytest -c .github/workflows/pytest-hindcast.ini
coverage lcov
- name: Upload coverage data to coveralls.io
uses: coverallsapp/github-action@master
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
flag-name: hindcast-${{ runner.os }}-py${{ matrix.python-version }}
parallel: true
path-to-lcov: ./coverage.lcov
test-wheel-packaging:
name: Test Built Wheel
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install build dependencies
run: python -m pip install build --user
- name: Build wheel
run: python -m build --wheel --outdir dist/ .
- name: Install MHKiT from built wheel
run: |
# Install from build wheel in dist/ directory, not from PyPI
# -f, --find-links <url> If a URL or path to an html file, then parse for links to archives such as sdist (.tar.gz) or wheel (.whl) files.
# If a local path or file:// URL that's a directory, then look for archives in the directory listing.
pip install 'mhkit[all]' --find-links dist/
- name: Test mhkit submodule imports
run: |
python -c "
import mhkit
print(f'Version: {mhkit.__version__}')
# Test all submodules can be imported
modules = ['wave', 'river', 'tidal', 'dolfyn', 'power', 'loads', 'mooring', 'acoustics', 'qc', 'utils']
for mod in modules:
exec(f'from mhkit import {mod}')
print(f'Successfully imported mhkit.{mod}')
print('All submodules imported successfully!')
"
- name: Verify mhkit package structure
run: |
python -c "
import mhkit
import os
mhkit_path = os.path.dirname(mhkit.__file__)
expected_dirs = ['wave', 'river', 'tidal', 'dolfyn', 'power', 'loads', 'mooring', 'acoustics', 'qc', 'utils']
for d in expected_dirs:
dir_path = os.path.join(mhkit_path, d)
assert os.path.isdir(dir_path), f'Missing submodule directory: {d}'
init_file = os.path.join(dir_path, '__init__.py')
assert os.path.isfile(init_file), f'Missing __init__.py in {d}'
print('Package structure verified!')
"
test-optional-pip-dependencies:
needs: [set-os, prepare-nonhindcast-cache]
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
module:
[wave, tidal, river, dolfyn, power, loads, mooring, acoustics, utils]
python-version: ['3.12']
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- name: Download non-hindcast data
uses: actions/download-artifact@v4
with:
name: data
path: ~/.cache/mhkit
- name: Install system dependencies
if: matrix.module != 'river' || matrix.module != 'power' || matrix.module != 'utils' || matrix.module != 'loads'
run: sudo apt-get install -y libhdf5-dev libnetcdf-dev
- name: Install MHKiT with optional dependency
run: |
python -m pip install --upgrade pip
pip install -e ".[${{ matrix.module }}]"
pip install pytest
- name: Reinstall h5py and netCDF4 with system libraries
if: matrix.module != 'river' || matrix.module != 'power' || matrix.module != 'utils' || matrix.module != 'loads'
run: "pip install --force-reinstall --no-binary=:all: h5py netCDF4"
- name: Run tests for ${{ matrix.module }}
env:
MPLBACKEND: Agg
run: |
python -m pytest -c .github/workflows/pytest.ini mhkit/tests/${{ matrix.module }}/
notebook-matrix:
runs-on: ubuntu-latest
needs:
[
check-changes,
prepare-nonhindcast-cache,
prepare-wave-hindcast-cache,
prepare-wind-hindcast-cache,
]
if: |
always() &&
(
(
needs.prepare-nonhindcast-cache.result == 'success' &&
needs.prepare-wave-hindcast-cache.result == 'skipped' &&
needs.prepare-wind-hindcast-cache.result == 'skipped' &&
needs.check-changes.outputs.should-run-hindcast == 'false'
) ||
(
needs.prepare-nonhindcast-cache.result == 'success' &&
needs.prepare-wave-hindcast-cache.result == 'success' &&
needs.prepare-wind-hindcast-cache.result == 'success' &&
needs.check-changes.outputs.should-run-hindcast == 'true'
)
)
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.11'
- name: Generate matrix
id: set-matrix
run: |
matrix_json=$(python .github/workflows/generate_notebook_matrix.py)
echo "$matrix_json" >> $GITHUB_OUTPUT
test-notebooks:
needs:
[
notebook-matrix,
check-changes,
prepare-nonhindcast-cache,
prepare-wave-hindcast-cache,
prepare-wind-hindcast-cache,
]
strategy:
matrix: ${{ fromJson(needs.notebook-matrix.outputs.matrix) }}
if: |
always()
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Miniconda
uses: conda-incubator/setup-miniconda@v3
with:
miniconda-version: 'latest'
auto-update-conda: true
python-version: '3.12'
channels: conda-forge
activate-environment: TESTconda
use-only-tar-bz2: false
- name: Create MHKiT Conda environment
shell: bash -l {0}
run: |
conda env create -f environment.yml
conda activate mhkit-env
- name: Install notebook testing dependencies
shell: bash -l {0}
run: |
conda activate mhkit-env
conda install -y pytest coverage coveralls nbval jupyter utm folium
- name: Install mhkit
shell: bash -l {0}
run: |
conda activate mhkit-env
pip install -e ".[all,dev]" --no-deps
- name: Download non-hindcast data
uses: actions/download-artifact@v4
with:
name: data
path: ~/.cache/mhkit
- name: Download Wave Hindcast data (if available)
if: (needs.check-changes.outputs.should-run-hindcast == 'true')
uses: actions/download-artifact@v4
with:
name: wave-hindcast-data
path: ~/.cache/mhkit/wave-hindcast
- name: Download Wind Hindcast data (if available)
if: (needs.check-changes.outputs.should-run-hindcast == 'true')
uses: actions/download-artifact@v4
with:
name: wind-hindcast-data
path: ~/.cache/mhkit/wind-hindcast
- name: Consolidate hindcast data
if: (needs.check-changes.outputs.should-run-hindcast == 'true')
run: |
mkdir -p ~/.cache/mhkit/hindcast
mv ~/.cache/mhkit/wave-hindcast/hindcast/* ~/.cache/mhkit/hindcast/
mv ~/.cache/mhkit/wind-hindcast/hindcast/* ~/.cache/mhkit/hindcast/
shell: bash
- name: Copy .hscfg file to examples directory
shell: bash -l {0}
run: |
cp .hscfg examples/
- name: Run notebook
shell: bash -l {0}
run: |
conda activate mhkit-env
if [[ "${{ matrix.notebook }}" == "examples/metocean_example.ipynb" || "${{ matrix.notebook }}" == "examples/WPTO_hindcast_example.ipynb" ]]; then
if [[ "${{ needs.check-changes.outputs.should-run-hindcast }}" == 'true' ]]; then
jupyter nbconvert --to notebook --execute --inplace --ExecutePreprocessor.timeout=${{ matrix.timeout }} "${{ matrix.notebook }}"
else
echo "Skipping ${{ matrix.notebook }}"
fi
else
jupyter nbconvert --to notebook --execute --inplace --ExecutePreprocessor.timeout=${{ matrix.timeout }} "${{ matrix.notebook }}"
fi
coveralls:
name: Indicate completion to coveralls.io
needs:
[
prepare-wave-hindcast-cache,
prepare-wind-hindcast-cache,
conda-build,
pip-build,
hindcast-calls,
]
if: |
always() &&
(
(
needs.conda-build.result == 'success' &&
needs.pip-build.result == 'success' &&
needs.prepare-wave-hindcast-cache.result == 'skipped' &&
needs.prepare-wind-hindcast-cache.result == 'skipped' &&
needs.hindcast-calls.result == 'skipped'
) ||
(
needs.conda-build.result == 'success' &&
needs.pip-build.result == 'success' &&
needs.prepare-wave-hindcast-cache.result == 'success' &&
needs.prepare-wind-hindcast-cache.result == 'success' &&
needs.hindcast-calls.result == 'success'
)
)
runs-on: ubuntu-latest
container: python:3-slim
steps:
- name: Coveralls Finished
uses: coverallsapp/github-action@master
with:
parallel-finished: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}