Skip to content

CI

CI #6413

Workflow file for this run

name: CI
on:
push:
branches:
- "main"
- "maintenance/.*"
pull_request:
branches:
- "main"
- "maintenance/.*"
schedule:
# Nightly tests run on main by default:
# Scheduled workflows run on the latest commit on the default or base branch.
# (from https://help.github.com/en/actions/reference/events-that-trigger-workflows#scheduled-events-schedule)
- cron: "0 0 * * *"
defaults:
run:
shell: bash -l {0}
jobs:
test:
if: (github.event_name == 'schedule' && github.repository == 'openforcefield/openff-toolkit') || (github.event_name != 'schedule')
name: Test on ${{ matrix.os }}, Python ${{ matrix.python-version }}, RDKit=${{ matrix.rdkit }}, OpenEye=${{ matrix.openeye }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest]
python-version: ["3.10", "3.11", "3.12"]
rdkit: [true, false]
openeye: [true, false]
exclude:
- rdkit: false
openeye: false
- openeye: true
python-version: "3.11"
- openeye: true
python-version: "3.12"
env:
OE_LICENSE: ${{ github.workspace }}/oe_license.txt
PACKAGE: openff
PYTEST_ARGS: -r fE --tb=short -nauto
COV: --cov=openff/toolkit --cov-config=setup.cfg --cov-append --cov-report=xml
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 2
- name: Set environment variables
run: |
if [[ ${{ matrix.openeye }} == true && ${{ matrix.rdkit }} == true ]]; then
echo "ENVFILE=test_env" >> $GITHUB_ENV
echo "JOBNAME=RDKit and OpenEye" >> $GITHUB_ENV
echo "TOOLKIT_CHECKS=RDKIT OPENEYE" >> $GITHUB_ENV
echo "PACKAGES_TO_REMOVE=" >> $GITHUB_ENV
fi
if [[ ${{ matrix.openeye }} == true && ${{ matrix.rdkit }} == false ]]; then
echo "ENVFILE=openeye" >> $GITHUB_ENV
echo "JOBNAME=OpenEye" >> $GITHUB_ENV
echo "TOOLKIT_CHECKS=OPENEYE" >> $GITHUB_ENV
echo "PACKAGES_TO_REMOVE=ambertools rdkit" >> $GITHUB_ENV
fi
if [[ ${{ matrix.openeye }} == false && ${{ matrix.rdkit }} == true ]]; then
echo "ENVFILE=rdkit" >> $GITHUB_ENV
echo "JOBNAME=RDKit" >> $GITHUB_ENV
echo "TOOLKIT_CHECKS=RDKIT" >> $GITHUB_ENV
echo "PACKAGES_TO_REMOVE=openeye-toolkits" >> $GITHUB_ENV
fi
- name: Install environment with ${{ env.JOBNAME }}
uses: mamba-org/setup-micromamba@v1
with:
environment-file: devtools/conda-envs/${{ env.ENVFILE }}.yaml
create-args: >-
python=${{ matrix.python-version }}
# default - will pull down 2.0 which we don't want!
# micromamba-version: latest
# pin to latest 1.x release
micromamba-version: "1.5.10-0"
- name: Make oe_license.txt file from GH org secret "OE_LICENSE"
env:
OE_LICENSE_TEXT: ${{ secrets.OE_LICENSE }}
run: echo "${OE_LICENSE_TEXT}" > ${OE_LICENSE}
- name: Install package
run: |
# While Interchange is being installed with pip, there is no need to
# force uninstall openff-toolkit-base since it's only pulled in when
# Interchange is installed with conda. Un-comment this when testing
# against a conda build of Interchange. (It may also be pulled down
# by `openmmforcefields` and should be removed in that case a well.)
micromamba remove --force openff-toolkit openff-toolkit-base
python -m pip install .
- name: Install test plugins
run: python -m pip install utilities/test_plugins
- name: Remove undesired toolkits
run: |
if [ ! -z "${{ env.PACKAGES_TO_REMOVE }}" ]; then
for cpkg in ${{ env.PACKAGES_TO_REMOVE }}; do
if [[ $(micromamba list | grep $cpkg) ]]; then micromamba remove --force $cpkg --yes ; fi
done
fi
- name: Remove NAGL if no RDKit
if: ${{ matrix.rdkit == false }}
run: micromamba remove --force openff-nagl-base --yes
- name: Check installed toolkits
run: |
for tk in ${{ env.TOOLKIT_CHECKS }}; do
python -c "from openff.toolkit.utils.toolkits import ${tk}_AVAILABLE; assert ${tk}_AVAILABLE, '${tk} unavailable'"
done
- name: Check uninstalled toolkits
run: |
if [ ! -z "${{ env.PACKAGES_TO_REMOVE }}" ]; then
for tk in ${{ env.PACKAGES_TO_REMOVE }}; do
TK=$(echo ${tk%-*} | tr 'a-z' 'A-Z')
python -c "from openff.toolkit.utils.toolkits import ${TK}_AVAILABLE; assert not ${TK}_AVAILABLE, '${TK} available'"
done
fi
- name: Environment Information
run: |
micromamba info
micromamba list
- name: Check links
if: ${{ matrix.rdkit == true && matrix.openeye == true }}
run: pytest -r fE --tb=short openff/toolkit/_tests/test_links.py
- name: Run mypy
# Subtle differences in Python/mypy versions, just keep it passing on one.
# When possible re-enable this with OE+RDK=True, but for now rdkit builds often have bugs
# in stubs and there are other subtleties (in the source code and builds) that reduce the number
# of available builds.
# See ex https://github.com/rdkit/rdkit/issues/7221
if: ${{ matrix.rdkit == false && matrix.openeye && matrix.python-version == 3.10 }}
run: mypy -p "openff.toolkit"
- name: Run unit tests
run: |
PYTEST_ARGS+=" --ignore=openff/toolkit/_tests/test_examples.py"
PYTEST_ARGS+=" --ignore=openff/toolkit/_tests/test_links.py"
if [[ "$GITHUB_EVENT_NAME" == "schedule" ]]; then
PYTEST_ARGS+=" --runslow"
fi
python -m pytest --durations=20 $PYTEST_ARGS $COV
- name: Run code snippets in docs
if: ${{ matrix.rdkit == true && matrix.openeye == true }}
run: pytest -v --no-cov --doctest-glob="docs/*.rst" --doctest-glob="docs/*.md" docs/
- name: Run notebooks in docs
if: ${{ matrix.rdkit == true && matrix.openeye == true }}
run: pytest -v --no-cov --nbval --ignore docs/_build/ docs/
- name: Run examples in docstrings
if: ${{ matrix.rdkit == true && matrix.openeye == true }}
run: |
pytest openff \
-v -x -n logical --no-cov --doctest-modules \
--ignore-glob='openff/toolkit/_tests*' \
--ignore=openff/toolkit/data/ \
--ignore=openff/toolkit/utils/utils.py
- name: Codecov
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
file: ./coverage.xml
disable_search: true
fail_ci_if_error: true