diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 00000000..fce82309 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,65 @@ +name: ci + +on: + push: + branches: + - "master" + pull_request: + branches: + - "master" + schedule: + # Run a cron job once daily + - cron: "0 0 * * *" + +jobs: + test: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [macOS-latest, ubuntu-latest] + python-version: [3.7] + env: + PYVER: ${{ matrix.python-version }} + PACKAGE: paprika + + steps: + - uses: actions/checkout@v2 + + - uses: conda-incubator/setup-miniconda@v1 + with: + python-version: ${{ matrix.python-version }} + activate-environment: paprika-dev + channel-priority: true + environment-file: devtools/conda-envs/test_env.yaml + auto-activate-base: false + + - name: Additional info about the build + shell: bash + run: | + uname -a + df -h + ulimit -a + + - name: Environment Information + shell: bash -l {0} + run: | + conda info --all + conda list + + - name: Install package + shell: bash -l {0} + run: | + python -m pip install --no-deps . + + - name: Run tests + shell: bash -l {0} + run: | + PYTEST_ARGS=" -v --cov=$PACKAGE --cov-report=xml " + pytest $PYTEST_ARGS $PACKAGE + + - name: Codecov + uses: codecov/codecov-action@v1 + with: + file: ./coverage.xml + fail_ci_if_error: true diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index df201135..00000000 --- a/.travis.yml +++ /dev/null @@ -1,50 +0,0 @@ -language: python - -# Run jobs on container-based infrastructure, can be overridden per job - -matrix: - include: - # Extra includes for OSX since python language is not available by default on OSX - # - os: osx - # language: generic - # env: PYTHON_VER=3.6 - - os: osx - language: generic - env: PYTHON_VER=3.7 - - # - os: linux - # - python: 3.6 - # - env: PYTHON_VER=3.6 - - os: linux - dist: xenial - python: 3.7 - env: PYTHON_VER=3.7 - -before_install: - # Additional info about the build - - uname -a - - df -h - - ulimit -a - - # Install the Python environment - - source devtools/travis-ci/before_install.sh - - python -V - -install: - - # Create test environment for package - - python devtools/scripts/create_conda_env.py -n=paprika-dev -p=$PYTHON_VER devtools/conda-envs/test_env.yaml - # Activate the test environment - - conda activate paprika-dev - # Build and install package - - python setup.py develop --no-deps - - -script: - - pytest -v --cov=paprika paprika/tests/ - -notifications: - email: false - -after_success: - - codecov diff --git a/README.md b/README.md index 023fafec..871a8ee0 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ pAPRika is a toolkit for setting up, running, and analyzing free energy molecular dynamics simulations. # Badges -[![Build Status](https://travis-ci.org/slochower/pAPRika.svg?branch=master)](https://travis-ci.org/slochower/pAPRika) +[![Build Status](https://github.com/slochower/pAPRika/workflows/ci/badge.svg)](https://github.com/slochower/pAPRika/actions?query=branch%3Amaster+workflow%3Aci) [![Documentation Status](https://readthedocs.org/projects/paprika/badge/?version=stable)](https://paprika.readthedocs.io/en/stable/?badge=stable) [![Anaconda-Server Badge](https://anaconda.org/conda-forge/paprika/badges/installer/conda.svg)](https://conda.anaconda.org/conda-forge) [![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/slochower/pAPRika.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/slochower/pAPRika/context:python) diff --git a/devtools/conda-envs/test_env.yaml b/devtools/conda-envs/test_env.yaml index 2f3c2f66..8ce0484e 100644 --- a/devtools/conda-envs/test_env.yaml +++ b/devtools/conda-envs/test_env.yaml @@ -2,7 +2,6 @@ name: paprika-dev channels: - conda-forge - omnia - - mwt dependencies: # Base depends diff --git a/devtools/scripts/create_conda_env.py b/devtools/scripts/create_conda_env.py deleted file mode 100644 index 37560d0e..00000000 --- a/devtools/scripts/create_conda_env.py +++ /dev/null @@ -1,118 +0,0 @@ -import argparse -import glob -import os -import re -import shutil -import subprocess as sp -from contextlib import contextmanager -from tempfile import TemporaryDirectory - -# YAML imports -try: - import yaml # PyYAML - - loader = yaml.load -except ImportError: - try: - import ruamel_yaml as yaml # Ruamel YAML - except ImportError: - try: - # Load Ruamel YAML from the base conda environment - from importlib import util as import_util - - CONDA_BIN = os.path.dirname(os.environ["CONDA_EXE"]) - ruamel_yaml_path = glob.glob( - os.path.join( - CONDA_BIN, - "..", - "lib", - "python*.*", - "site-packages", - "ruamel_yaml", - "__init__.py", - ) - )[0] - # Based on importlib example, but only needs to load_module since its the whole package, not just - # a module - spec = import_util.spec_from_file_location("ruamel_yaml", ruamel_yaml_path) - yaml = spec.loader.load_module() - except (KeyError, ImportError, IndexError): - raise ImportError( - "No YAML parser could be found in this or the conda environment. " - "Could not find PyYAML or Ruamel YAML in the current environment, " - "AND could not find Ruamel YAML in the base conda environment through CONDA_EXE path. " - "Environment not created!" - ) - loader = yaml.YAML(typ="safe").load # typ="safe" avoids odd typing on output - - -@contextmanager -def temp_cd(): - """Temporary CD Helper""" - cwd = os.getcwd() - with TemporaryDirectory() as td: - try: - os.chdir(td) - yield - finally: - os.chdir(cwd) - - -# Args -parser = argparse.ArgumentParser( - description="Creates a conda environment from file for a given Python version." -) -parser.add_argument( - "-n", "--name", type=str, help="The name of the created Python environment" -) -parser.add_argument( - "-p", "--python", type=str, help="The version of the created Python environment" -) -parser.add_argument("conda_file", help="The file for the created Python environment") - -args = parser.parse_args() - -# Open the base file -with open(args.conda_file, "r") as handle: - yaml_script = loader(handle.read()) - -python_replacement_string = "python {}*".format(args.python) - -try: - for dep_index, dep_value in enumerate(yaml_script["dependencies"]): - if re.match( - "python([ ><=*]+[0-9.*]*)?$", dep_value - ): # Match explicitly 'python' and its formats - yaml_script["dependencies"].pop(dep_index) - break # Making the assumption there is only one Python entry, also avoids need to enumerate in reverse -except (KeyError, TypeError): - # Case of no dependencies key, or dependencies: None - yaml_script["dependencies"] = [] -finally: - # Ensure the python version is added in. Even if the code does not need it, we assume the env does - yaml_script["dependencies"].insert(0, python_replacement_string) - -# Figure out conda path -if "CONDA_EXE" in os.environ: - conda_path = os.environ["CONDA_EXE"] -else: - conda_path = shutil.which("conda") -if conda_path is None: - raise RuntimeError( - "Could not find a conda binary in CONDA_EXE variable or in executable search path" - ) - -print("CONDA ENV NAME {}".format(args.name)) -print("PYTHON VERSION {}".format(args.python)) -print("CONDA FILE NAME {}".format(args.conda_file)) -print("CONDA PATH {}".format(conda_path)) - -# Write to a temp directory which will always be cleaned up -with temp_cd(): - temp_file_name = "temp_script.yaml" - with open(temp_file_name, "w") as f: - f.write(yaml.dump(yaml_script)) - sp.call( - "{} env create -n {} -f {}".format(conda_path, args.name, temp_file_name), - shell=True, - ) diff --git a/devtools/travis-ci/before_install.sh b/devtools/travis-ci/before_install.sh deleted file mode 100755 index ed06d3f2..00000000 --- a/devtools/travis-ci/before_install.sh +++ /dev/null @@ -1,42 +0,0 @@ -# Temporarily change directory to $HOME to install software -pushd . -cd $HOME -# Make sure some level of pip is installed -python -m ensurepip - -# Install Miniconda -if [ "$TRAVIS_OS_NAME" == "osx" ]; then - # Make OSX md5 mimic md5sum from linux, alias does not work - md5sum () { - command md5 -r "$@" - } - MINICONDA=Miniconda3-latest-MacOSX-x86_64.sh -else - MINICONDA=Miniconda3-latest-Linux-x86_64.sh - export PYTHON_VER=$TRAVIS_PYTHON_VERSION -fi -MINICONDA_HOME=$HOME/miniconda -MINICONDA_MD5=$(wget -qO- https://repo.anaconda.com/miniconda/ | grep -A3 $MINICONDA | sed -n '4p' | sed -n 's/ *\(.*\)<\/td> */\1/p') -wget -q https://repo.anaconda.com/miniconda/$MINICONDA -if [[ $MINICONDA_MD5 != $(md5sum $MINICONDA | cut -d ' ' -f 1) ]]; then - echo "Miniconda MD5 mismatch" - exit 1 -fi -bash $MINICONDA -b -p $MINICONDA_HOME - -# Configure miniconda -export PIP_ARGS="-U" -# New to conda >=4.4 -echo ". $MINICONDA_HOME/etc/profile.d/conda.sh" >> ~/.bashrc # Source the profile.d file -echo "conda activate" >> ~/.bashrc # Activate conda -source ~/.bashrc # source file to get new commands -#export PATH=$MINICONDA_HOME/bin:$PATH # Old way, should not be needed anymore - -conda config --add channels conda-forge - -conda config --set always_yes yes -conda install conda conda-build jinja2 anaconda-client -conda update --quiet --all - -# Restore original directory -popd