diff --git a/.gitignore b/.gitignore index bc4d4198..177ad619 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ pavics-sdi-*/ finch-*/ raven-*/ +RavenPy-*/ esgf-compute-api-*/ PAVICS-landing-*/ diff --git a/Jenkinsfile b/Jenkinsfile index 6784ef0a..78be8f38 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -10,7 +10,7 @@ pipeline { // https://jenkins.io/doc/book/pipeline/syntax/ agent { docker { - image "pavics/workflow-tests:221130-update230403" + image "pavics/workflow-tests:230530-1" label 'linux && docker' } } @@ -66,14 +66,20 @@ Requires 'weaver' component to be active on the target 'PAVICS_HOST' server description: 'RAVEN_REPO branch to test against.', trim: true) string(name: 'RAVEN_REPO', defaultValue: 'Ouranosinc/raven', description: 'https://github.com/Ouranosinc/raven repo or fork to test against.', trim: true) + booleanParam(name: 'TEST_RAVENPY_REPO', defaultValue: false, + description: 'Check the box to test RavenPy repo.') + string(name: 'RAVENPY_BRANCH', defaultValue: 'master', + description: 'RAVENPY_REPO branch to test against.', trim: true) + string(name: 'RAVENPY_REPO', defaultValue: 'CSHS-CWRA/RavenPy', + description: 'https://github.com/CSHS-CWRA/RavenPy repo or fork to test against.', trim: true) booleanParam(name: 'TEST_ESGF_COMPUTE_API_REPO', defaultValue: false, description: 'Check the box to test esgf-compute-api repo.') string(name: 'ESGF_COMPUTE_API_BRANCH', defaultValue: 'devel', description: 'ESGF_COMPUTE_API_REPO branch to test against.', trim: true) string(name: 'ESGF_COMPUTE_API_REPO', defaultValue: 'ESGF/esgf-compute-api', description: 'https://github.com/ESGF/esgf-compute-api repo or fork to test against.', trim: true) - string(name: 'PYTEST_EXTRA_OPTS', defaultValue: '', - description: 'Extra options to pass to pytest, ex: --nbval-lax', trim: true) + string(name: 'PYTEST_EXTRA_OPTS', defaultValue: '--dist=loadscope --numprocesses=0', + description: 'Extra options to pass to pytest, ex: --nbval-lax --dist=loadscope --numprocesses=0', trim: true) string(name: 'EXTRA_TEST_ENV_VAR', defaultValue: '', description: 'Extra environment variables for the various tests, ex: "TEST_RUNS=50 TEST_WPS_BIRDS=finch,raven,flyingpigeon TEST_NO_USE_PROD_DATA=1"', trim: true) booleanParam(name: 'TEST_LOCAL_NOTEBOOKS', defaultValue: true, @@ -101,6 +107,16 @@ Note this is another run, will double the time and no guaranty to have same erro variable: 'ESGF_AUTH_TOKEN'), // Kept old env var name for backward compat string(credentialsId: 'esgf_auth_token', variable: 'COMPUTE_TOKEN'), // ESGF expect this env var name + // For RavenPy HydroShare_integration.ipynb once a token is really required. + // Not enable immediately to not force all existing Jenkins deployments + // to add theses new credentials. + // See required Jenkins config change + // https://github.com/Ouranosinc/jenkins-config/commit/c6b36cfb761b5093375225a121ef5ec04684e84b + // https://github.com/Ouranosinc/jenkins-config/pull/15 + // string(credentialsId: 'hydroshare_auth_client_id', + // variable: 'HYDROSHARE_AUTH_CLIENT_ID'), + // string(credentialsId: 'hydroshare_auth_token', + // variable: 'HYDROSHARE_AUTH_TOKEN'), ]) { sh("VERIFY_SSL=${params.VERIFY_SSL} \ SAVE_RESULTING_NOTEBOOK=${params.SAVE_RESULTING_NOTEBOOK} \ @@ -118,6 +134,7 @@ Note this is another run, will double the time and no guaranty to have same erro archiveArtifacts(artifacts: 'pavics-sdi-*/docs/source/notebook-components/*.ipynb', fingerprint: true) archiveArtifacts(artifacts: 'finch-*/docs/source/notebooks/*.ipynb', fingerprint: true) archiveArtifacts(artifacts: 'raven-*/docs/source/notebooks/*.ipynb', fingerprint: true) + archiveArtifacts(artifacts: 'RavenPy-*/docs/notebooks/*.ipynb', fingerprint: true) archiveArtifacts(artifacts: 'esgf-compute-api-*/examples/*.ipynb', fingerprint: true) archiveArtifacts(artifacts: 'PAVICS-landing-*/content/notebooks/climate_indicators/*.ipynb', fingerprint: true) archiveArtifacts(artifacts: 'buildout/*.output.ipynb', fingerprint: true, allowEmptyArchive: true) diff --git a/binder/Dockerfile b/binder/Dockerfile index 59d9d244..8b11a056 100644 --- a/binder/Dockerfile +++ b/binder/Dockerfile @@ -1,4 +1,4 @@ -FROM pavics/workflow-tests:221130-update230403 +FROM pavics/workflow-tests:230530-1 USER root diff --git a/binder/reorg-notebooks b/binder/reorg-notebooks index 8ec894ea..8c75ad38 100755 --- a/binder/reorg-notebooks +++ b/binder/reorg-notebooks @@ -5,8 +5,12 @@ # if name clash, last command wins -mv -v esgf-compute-api-$ESGF_COMPUTE_API_BRANCH/examples ./esgf-compute-api-examples-$ESGF_COMPUTE_API_BRANCH -rm -rfv esgf-compute-api-$ESGF_COMPUTE_API_BRANCH +rm -r esgf-compute-api-$ESGF_COMPUTE_API_BRANCH + +mkdir raven +mv -v raven-${RAVEN_BRANCH}/docs/source/notebooks/*.ipynb ./raven/ +mv -v RavenPy-${RAVENPY_BRANCH}/docs/notebooks/*.ipynb ./raven/ +rm -r raven-${RAVEN_BRANCH} RavenPy-${RAVENPY_BRANCH} if [ -n "$DEPLOY_PAVICS_LANDING_NB" ]; then # Pavics landing notebooks already deployed to Jupyter env via @@ -15,10 +19,10 @@ if [ -n "$DEPLOY_PAVICS_LANDING_NB" ]; then mv -v PAVICS-landing-$PAVICS_LANDING_BRANCH/content/notebooks/climate_indicators ./pavics-homepage rm -v ./pavics-homepage/*.html fi -rm -rfv PAVICS-landing-$PAVICS_LANDING_BRANCH +rm -r PAVICS-landing-$PAVICS_LANDING_BRANCH mv -v pavics-sdi-$PAVICS_SDI_BRANCH/docs/source/notebooks/*.ipynb ./ -rm -rfv pavics-sdi-$PAVICS_SDI_BRANCH +rm -r pavics-sdi-$PAVICS_SDI_BRANCH mv -v finch-$FINCH_BRANCH/docs/source/notebooks/*.ipynb ./ -rm -rfv finch-$FINCH_BRANCH +rm -r finch-$FINCH_BRANCH diff --git a/default_build_params b/default_build_params index de71da6b..5fba9440 100644 --- a/default_build_params +++ b/default_build_params @@ -84,6 +84,27 @@ else echo "RAVEN_REPO has been set to '$RAVEN_REPO'" fi +if [ -z "$TEST_RAVENPY_REPO" ]; then + TEST_RAVENPY_REPO=false + echo "TEST_RAVENPY_REPO not set, default to '$TEST_RAVENPY_REPO'" +else + echo "TEST_RAVENPY_REPO has been set to '$TEST_RAVENPY_REPO'" +fi + +if [ -z "$RAVENPY_BRANCH" ]; then + RAVENPY_BRANCH=master + echo "RAVENPY_BRANCH not set, default to '$RAVENPY_BRANCH'" +else + echo "RAVENPY_BRANCH has been set to '$RAVENPY_BRANCH'" +fi + +if [ -z "$RAVENPY_REPO" ]; then + RAVENPY_REPO='CSHS-CWRA/RavenPy' + echo "RAVENPY_REPO not set, default to '$RAVENPY_REPO'" +else + echo "RAVENPY_REPO has been set to '$RAVENPY_REPO'" +fi + if [ -z "$TEST_ESGF_COMPUTE_API_REPO" ]; then TEST_ESGF_COMPUTE_API_REPO=false echo "TEST_ESGF_COMPUTE_API_REPO not set, default to '$TEST_ESGF_COMPUTE_API_REPO'" diff --git a/docker/Dockerfile b/docker/Dockerfile index 4aa5e126..b7da9aab 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -4,6 +4,7 @@ FROM continuumio/miniconda3 # The 'channel_priority strict' did help conda but it was not enough. RUN conda update conda -n base && \ conda install mamba -n base -c conda-forge -c defaults && \ + conda clean --all --yes && \ conda config --set channel_priority strict && \ wget -qO- https://micro.mamba.pm/api/micromamba/linux-64/latest | tar -C /usr/local -xvj bin/micromamba @@ -42,14 +43,12 @@ COPY environment.yml /environment.yml # Conda was stuck at this step: # DEBUG conda.common._logic:_run_sat(607): Invoking SAT with clause count: 2500273 # -# Pin python=3.9 because python 3.10 cause this error: -# Encountered problems while solving: -# - package cartopy-0.20.1-py310h902574e_5 requires geos >=3.10.1,<3.10.2.0a0, but none of the providers can be installed -# This means there is no py310 build for geos package but https://anaconda.org/conda-forge/geos/files seems to be python indepdendent ! -# Pin python=3.8 because according to DavidH, xESMF has not been tested with 3.9 yet. +# Python 3.10 cause this "ValueError: `popmean.shape[axis]` must equal 1." in +# homepage nb 4, see https://github.com/Ouranosinc/PAVICS-landing/issues/65 RUN umask 0000 && \ - mamba create --name birdy --channel conda-forge --channel defaults xclim ravenpy python=3.8 --yes && \ - mamba env update --name birdy --file /environment.yml + mamba create --name birdy --channel conda-forge --channel defaults xclim ravenpy python=3.9 --yes && \ + mamba env update --name birdy --file /environment.yml && \ + mamba clean --all --yes # alternate way to 'source activate birdy' ENV PATH="/opt/conda/envs/birdy/bin:$PATH" @@ -100,12 +99,26 @@ RUN wget https://raw.githubusercontent.com/jupyter/docker-stacks/$DOCKER_STACKS_ chmod a+r /etc/jupyter/jupyter_notebook_config.py && \ mkdir /notebook_dir && chown jenkins /notebook_dir && \ chmod a+rwX -R /opt/conda/envs/birdy/fonts && \ - chmod a+rwX -R /opt/conda/pkgs/cache && \ - chown jenkins:jenkins -R /opt/conda/pkgs/cache + mkdir /opt/conda/pkgs/cache && \ + chown jenkins:jenkins -R /opt/conda/pkgs/cache && \ + mkdir -p /usr/local/bin && \ + wget https://downloads.globus.org/globus-connect-personal/linux/stable/globusconnectpersonal-latest.tgz -O /usr/local/bin/globusconnectpersonal-latest.tgz && \ + tar xzf /usr/local/bin/globusconnectpersonal-latest.tgz -C /usr/local/bin/ && \ + ln -vs /usr/local/bin/globusconnectpersonal*/globusconnectpersonal /usr/local/bin/globusconnectpersonal && \ + rm -v /usr/local/bin/globusconnectpersonal-latest.tgz # For jupyter-panel-proxy launcher. ENV BOKEH_ALLOW_WS_ORIGIN "*" +# For import xesmf since esmf-8.4.0, see +# https://github.com/conda-forge/esmf-feedstock/issues/91 +ENV ESMFMKFILE="/opt/conda/envs/birdy/lib/esmf.mk" + +# To avoid error "PROJ: proj_create_from_database: Open of +# /opt/conda/envs/birdy/share/proj failed" +# This simulates a real `conda activate birdy`. +ENV PROJ_DATA="/opt/conda/envs/birdy/share/proj" + # problem running start-notebook.sh when being root # the jupyter/base-notebook image also do not default to root user so we do the same here USER jenkins diff --git a/docker/Dockerfile.testing b/docker/Dockerfile.testing index 8aad5b1e..bf5d0250 100644 --- a/docker/Dockerfile.testing +++ b/docker/Dockerfile.testing @@ -1,23 +1,23 @@ # For testing quickly without having to do a full rebuild. -FROM pavics/workflow-tests:221130 +FROM pavics/workflow-tests:230526-1 -# To avoid error "PROJ: proj_create_from_database: Open of /opt/conda/envs/birdy/share/proj failed" -# This simulates a real `conda activate birdy`. -ENV PROJ_DATA="/opt/conda/envs/birdy/share/proj" +#ENV ESMFMKFILE="/opt/conda/envs/birdy/lib/esmf.mk" + +#ENV PROJ_DATA="/opt/conda/envs/birdy/share/proj" USER root # Use 'update' for existing and 'install' for new package. # Keep same channel ordering to not revert anything. -# esgf-pyclient for pavics-sdi esgf-dap.ipynb, PR https://github.com/Ouranosinc/pavics-sdi/pull/269 -# xncml for gen_catalog refactoring, PR https://github.com/Ouranosinc/pavics-vdb/pull/46 RUN umask 0000 \ - && mamba install -c conda-forge -c cdat -c bokeh -c plotly -c pyston -c pyviz/label/dev -c defaults -n birdy esgf-pyclient \ - && pip install xncml + && mamba install -c conda-forge -c cdat -c bokeh -c plotly -c pyviz/label/dev -c defaults -n birdy numpy==1.23.5 pytest-xdist \ + && mamba clean --all --yes # && pip uninstall -y ravenpy \ # && mamba install -c conda-forge -c cdat -c bokeh -c plotly -c defaults -n birdy ravenpy aiohttp +#RUN umask 0000 \ +# && python -m pip install --upgrade --force-reinstall --no-deps --no-cache-dir netcdf4==1.6.0 --no-binary netcdf4 # RUN apt-get update && \ # DEBIAN_FRONTEND=noninteractive apt-get install -y unzip && \ # apt-get clean && \ diff --git a/docker/environment.yml b/docker/environment.yml index 87e7b023..00a19d17 100644 --- a/docker/environment.yml +++ b/docker/environment.yml @@ -5,7 +5,7 @@ channels: - cdat - bokeh - plotly # for jupyter-dash - - pyston + # - pyston - pyviz/label/dev # for jupyter-panel-proxy, panel - defaults @@ -19,8 +19,8 @@ dependencies: # Pin latest xclim and ravenpy to avoid downgrading during the second installation phase. # Mamba is quicker to solve dependencies than conda, but it is less precise so accidental downgrades can happen. - - xclim >= 0.38.0 - - ravenpy >= 0.7.8 + - xclim >= 0.43.0 + - ravenpy >= 0.12.0 #- dask # from xclim and ravenpy #- distributed @@ -32,9 +32,17 @@ dependencies: - matplotlib # - xarray # from xclim and ravenpy # - numpy # from xclim and ravenpy + # TODO: unpin numpy, pinned for hvplot.quadmesh(rasterize=True) + # datashade=True is an alias + # See https://github.com/holoviz/hvplot/issues/1073 + - numpy <= 1.23.5 + # TODO: unpin cf_xarray due to https://github.com/xarray-contrib/cf-xarray/issues/442 + - cf_xarray != 0.8.1 - birdy # - owslib>=0.23.0 # from ravenpy # - netcdf4 # from ravenpy + # TODO: remove libnetcdf PIN because https://github.com/Ouranosinc/PAVICS-landing/issues/66 + - libnetcdf <= 4.8.1 # https://github.com/ecmwf/cfgrib # Python interface to map GRIB files to the Unidata's Common Data Model v4 # following the CF Conventions. @@ -47,6 +55,9 @@ dependencies: # - geopandas # from ravenpy # - pandas # from xclim and ravenpy # - rioxarray # from ravenpy + # https://anaconda.org/conda-forge/pyogrio + # Vectorized vector I/O using GDAL + - pyogrio - scikit-image - ipyleaflet - threddsclient @@ -56,11 +67,12 @@ dependencies: - jupyter_bokeh - pscript - h5netcdf - - panel >= 0.13.1a3 + # TODO: remove panel pin when Analogues dashboard works + - panel <= 0.14.4 # https://github.com/holoviz/panel - pyviz_comms # (was labextension pyviz/jupyterlab_pyviz in jupyterlab v2) - holoviews - - geoviews + - geoviews >= 1.9.6 # this might still be relevant https://github.com/holoviz/hvplot/issues/498 # (violin plot not working with hvplot 0.6.0). # Per this comment @@ -70,6 +82,9 @@ dependencies: # https://streamlit.io/ # https://anaconda.org/conda-forge/streamlit - streamlit + # https://anaconda.org/conda-forge/seaborn + # Statistical data visualization + - seaborn # python-pptx is a Python library for creating and updating PowerPoint (.pptx) files. # https://python-pptx.readthedocs.io/en/latest/ # https://anaconda.org/conda-forge/python-pptx @@ -120,6 +135,8 @@ dependencies: - memory_profiler # for esgf notebooks - esgf-compute-api + # https://anaconda.org/conda-forge/esgf-pyclient (for pavics-sdi esgf-dap.ipynb) + - esgf-pyclient - cdms2 # Disable vcs because it was forcing python downgrade to below 3.9. # See https://github.com/CDAT/vcs/issues/457 @@ -129,6 +146,7 @@ dependencies: - mesalib # tests - pytest + - pytest-xdist - nbval # to edit .ipynb - jupyter @@ -187,11 +205,20 @@ dependencies: - geckodriver - xlrd - pre-commit + # pyston_lite_autoload blocked us from using newer Python than 3.8 + # package pyston_lite_autoload-2.3.4-pyh44b312d_0 requires pyston_lite + # 2.3.4 py38h0a891b7_0, but none of the providers can be installed # https://github.com/pyston/pyston/ - - pyston_lite_autoload + # - pyston_lite_autoload # for pip packages - pip - pip: + # https://pypi.org/project/xncml/ + # Tools for manipulating and opening NCML (NetCDF Markup) files with/for xarray + - xncml + # https://pypi.org/project/hsclient/ + # A python client for managing HydroShare resources, replaces hs_restclient + - hsclient # visual debugger for Jupyter Notebook, not working with JupyterLab at this moment - pixiedust # block execution of 'run_all_cells' until user input finished diff --git a/downloadrepos b/downloadrepos index 8742a869..9702c261 100755 --- a/downloadrepos +++ b/downloadrepos @@ -29,6 +29,7 @@ if [ -z "$1" ]; then downloadgithubrepos $FINCH_REPO $FINCH_BRANCH downloadgithubrepos $PAVICS_LANDING_REPO $PAVICS_LANDING_BRANCH downloadgithubrepos $RAVEN_REPO $RAVEN_BRANCH + downloadgithubrepos $RAVENPY_REPO $RAVENPY_BRANCH downloadgithubrepos $ESGF_COMPUTE_API_REPO $ESGF_COMPUTE_API_BRANCH else set -x diff --git a/launchcontainer b/launchcontainer index 313c0e9c..9578fc62 100755 --- a/launchcontainer +++ b/launchcontainer @@ -1,7 +1,7 @@ #!/bin/sh -x if [ -z "$DOCKER_IMAGE" ]; then - DOCKER_IMAGE="pavics/workflow-tests:221130-update230403" + DOCKER_IMAGE="pavics/workflow-tests:230530-1" fi if [ -z "$CONTAINER_NAME" ]; then diff --git a/launchnotebook b/launchnotebook index cfd758ea..042a0fc6 100755 --- a/launchnotebook +++ b/launchnotebook @@ -7,7 +7,7 @@ if [ -z "$PORT" ]; then fi if [ -z "$DOCKER_IMAGE" ]; then - DOCKER_IMAGE="pavics/workflow-tests:221130-update230403" + DOCKER_IMAGE="pavics/workflow-tests:230530-1" fi if [ -z "$CONTAINER_NAME" ]; then diff --git a/testall b/testall index 126efe39..5a15c30d 100755 --- a/testall +++ b/testall @@ -21,6 +21,8 @@ PAVICS_LANDING_BRANCH="`echo "$PAVICS_LANDING_BRANCH" | sed "s@/@-@g"`" PAVICS_LANDING_REPO_NAME="`echo "$PAVICS_LANDING_REPO" | sed "s@^.*/@@g"`" RAVEN_BRANCH="`echo "$RAVEN_BRANCH" | sed "s@/@-@g"`" RAVEN_REPO_NAME="`echo "$RAVEN_REPO" | sed "s@^.*/@@g"`" +RAVENPY_BRANCH="`echo "$RAVENPY_BRANCH" | sed "s@/@-@g"`" +RAVENPY_REPO_NAME="`echo "$RAVENPY_REPO" | sed "s@^.*/@@g"`" ESGF_COMPUTE_API_BRANCH="`echo "$ESGF_COMPUTE_API_BRANCH" | sed "s@/@-@g"`" ESGF_COMPUTE_API_REPO_NAME="`echo "$ESGF_COMPUTE_API_REPO" | sed "s@^.*/@@g"`" @@ -29,6 +31,7 @@ PAVICS_SDI_DIR=`echo "${PAVICS_SDI_REPO_NAME}-${PAVICS_SDI_BRANCH}" | sed "s@[^a FINCH_DIR=`echo "${FINCH_REPO_NAME}-${FINCH_BRANCH}" | sed "s@[^a-zA-Z0-9_\-\.]@-@g"` PAVICS_LANDING_DIR=`echo "${PAVICS_LANDING_REPO_NAME}-${PAVICS_LANDING_BRANCH}" | sed "s@[^a-zA-Z0-9_\-\.]@-@g"` RAVEN_DIR=`echo "${RAVEN_REPO_NAME}-${RAVEN_BRANCH}" | sed "s@[^a-zA-Z0-9_\-\.]@-@g"` +RAVENPY_DIR=`echo "${RAVENPY_REPO_NAME}-${RAVENPY_BRANCH}" | sed "s@[^a-zA-Z0-9_\-\.]@-@g"` ESGF_COMPUTE_API_DIR=`echo "${ESGF_COMPUTE_API_REPO_NAME}-${ESGF_COMPUTE_API_BRANCH}" | sed "s@[^a-zA-Z0-9_\-\.]@-@g"` # lowercase VERIFY_SSL string @@ -42,9 +45,13 @@ if [ x"$VERIFY_SSL" = xfalse ]; then echo "setting env var DISABLE_VERIFY_SSL for notebooks" fi -# presence of setup.cfg, tox.ini files confuse py.test execution rootdir discovery +# presence of setup.cfg, tox.ini, pyproject.toml files confuse py.test execution rootdir discovery rm -v $FINCH_REPO_NAME-$FINCH_BRANCH/setup.cfg rm -v $RAVEN_REPO_NAME-$RAVEN_BRANCH/setup.cfg +rm -v $RAVEN_REPO_NAME-$RAVEN_BRANCH/pyproject.toml +rm -v $RAVENPY_REPO_NAME-$RAVENPY_BRANCH/setup.cfg +rm -v $RAVENPY_REPO_NAME-$RAVENPY_BRANCH/tox.ini +rm -v $RAVENPY_REPO_NAME-$RAVENPY_BRANCH/pyproject.toml rm -v $ESGF_COMPUTE_API_REPO_NAME-$ESGF_COMPUTE_API_BRANCH/setup.cfg rm -v $ESGF_COMPUTE_API_REPO_NAME-$ESGF_COMPUTE_API_BRANCH/tox.ini @@ -55,6 +62,7 @@ TEST_PAVICS_SDI_WEAVER="`echo "$TEST_PAVICS_SDI_WEAVER" | tr '[:upper:]' '[:lowe TEST_FINCH_REPO="`echo "$TEST_FINCH_REPO" | tr '[:upper:]' '[:lower:]'`" TEST_PAVICS_LANDING_REPO="`echo "$TEST_PAVICS_LANDING_REPO" | tr '[:upper:]' '[:lower:]'`" TEST_RAVEN_REPO="`echo "$TEST_RAVEN_REPO" | tr '[:upper:]' '[:lower:]'`" +TEST_RAVENPY_REPO="`echo "$TEST_RAVENPY_REPO" | tr '[:upper:]' '[:lower:]'`" TEST_ESGF_COMPUTE_API_REPO="`echo "$TEST_ESGF_COMPUTE_API_REPO" | tr '[:upper:]' '[:lower:]'`" TEST_LOCAL_NOTEBOOKS="`echo "$TEST_LOCAL_NOTEBOOKS" | tr '[:upper:]' '[:lower:]'`" @@ -89,6 +97,9 @@ fi if [ x"$TEST_RAVEN_REPO" = xtrue ]; then NOTEBOOKS_TO_TEST="$NOTEBOOKS_TO_TEST ${RAVEN_DIR}/docs/source/notebooks/*.ipynb" fi +if [ x"$TEST_RAVENPY_REPO" = xtrue ]; then + NOTEBOOKS_TO_TEST="$NOTEBOOKS_TO_TEST ${RAVENPY_DIR}/docs/notebooks/*.ipynb" +fi if [ x"$TEST_ESGF_COMPUTE_API_REPO" = xtrue ]; then NOTEBOOKS_TO_TEST="$NOTEBOOKS_TO_TEST ${ESGF_COMPUTE_API_DIR}/examples/*.ipynb" fi