From edaa23af61a38fc527e68ac940067f83b45d468f Mon Sep 17 00:00:00 2001
From: Tremain Knight <2108488+tkknight@users.noreply.github.com>
Date: Sun, 12 Jul 2020 14:32:36 +0100
Subject: [PATCH 1/8] overhaul to use readthedocs theme and service
---
.gitignore | 7 +-
.readthedocs.yml | 19 +
.travis.yml | 25 +-
INSTALL | 7 +-
README.md | 6 +-
ci/requirements/readthedocs-conda.yml | 60 +
docs/iris/Makefile | 28 +-
docs/iris/gallery_code/README.rst | 26 +
docs/iris/gallery_code/general/README.rst | 2 +
.../general}/__init__.py | 0
.../general/plot_SOI_filtering.py} | 0
.../general/plot_anomaly_log_colouring.py} | 2 +-
.../general/plot_coriolis.py} | 0
.../general/plot_cross_section.py} | 0
.../general/plot_custom_aggregation.py} | 0
.../general/plot_custom_file_loading.py} | 0
.../general/plot_global_map.py} | 0
.../general/plot_inset.py} | 0
.../general/plot_lineplot_with_legend.py} | 0
.../general/plot_orca_projection.py} | 0
.../general/plot_polar_stereo.py} | 0
.../general/plot_polynomial_fit.py} | 0
.../plot_projections_and_annotations.py} | 0
.../general/plot_rotated_pole_mapping.py} | 0
docs/iris/gallery_code/meteorology/README.rst | 3 +
.../meteorology}/__init__.py | 0
.../meteorology/plot_COP_1d.py} | 0
.../meteorology/plot_COP_maps.py} | 0
.../meteorology/plot_TEC.py} | 0
.../meteorology/plot_deriving_phenomena.py} | 0
.../meteorology/plot_hovmoller.py} | 0
.../meteorology/plot_lagged_ensemble.py} | 0
.../meteorology/plot_wind_speed.py} | 0
.../iris/gallery_code/oceanography/README.rst | 3 +
.../oceanography}/__init__.py | 0
.../oceanography/plot_atlantic_profiles.py} | 0
.../oceanography/plot_load_nemo.py} | 0
.../__init__.py | 0
.../gallerytest_util.py} | 20 +-
.../test_plot_COP_1d.py} | 14 +-
.../test_plot_COP_maps.py} | 14 +-
.../test_plot_SOI_filtering.py} | 14 +-
.../test_plot_TEC.py} | 14 +-
.../test_plot_anomaly_log_colouring.py} | 14 +-
.../test_plot_atlantic_profiles.py} | 14 +-
.../test_plot_coriolis.py} | 14 +-
.../test_plot_cross_section.py} | 14 +-
.../test_plot_custom_aggregation.py} | 14 +-
.../test_plot_custom_file_loading.py} | 14 +-
.../test_plot_deriving_phenomena.py} | 14 +-
.../test_plot_global_map.py} | 14 +-
.../test_plot_hovmoller.py} | 14 +-
.../test_plot_inset.py} | 14 +-
.../test_plot_lagged_ensemble.py} | 14 +-
.../test_plot_lineplot_with_legend.py} | 14 +-
.../test_plot_load_nemo.py} | 14 +-
.../test_plot_orca_projection.py} | 14 +-
.../test_plot_polar_stereo.py} | 14 +-
.../test_plot_polynomial_fit.py} | 14 +-
.../test_plot_projections_and_annotations.py} | 14 +-
.../test_plot_rotated_pole_mapping.py} | 14 +-
.../test_plot_wind_speed.py} | 14 +-
docs/iris/src/Makefile | 34 +-
docs/iris/src/_static/copybutton.js | 59 -
docs/iris/src/_static/favicon-16x16.png | Bin 1041 -> 0 bytes
docs/iris/src/_static/favicon-32x32.png | Bin 2954 -> 0 bytes
docs/iris/src/_static/favicon.ico | Bin 0 -> 1150 bytes
docs/iris/src/_static/iris-logo-title.png | Bin 0 -> 38785 bytes
docs/iris/src/_static/iris-logo-title.svg | 89 ++
.../src/_static/iris_colour_logo_centred.png | Bin 327072 -> 0 bytes
.../src/_static/jquery.cycle.all.latest.js | 1331 -----------------
docs/iris/src/_static/logo_banner.png | Bin 31305 -> 0 bytes
docs/iris/src/_static/style.css | 99 --
docs/iris/src/_static/theme_override.css | 28 +
docs/iris/src/_templates/index.html | 146 --
docs/iris/src/_templates/layout.html | 88 +-
docs/iris/src/conf.py | 355 +++--
docs/iris/src/contents.rst | 32 -
docs/iris/src/copyright.rst | 4 +-
.../iris/src/developers_guide/code_format.rst | 2 +-
.../contributing_documentation.rst | 145 ++
.../documenting/docstrings.rst | 7 +-
.../documenting/rest_guide.rst | 24 +-
.../documenting/whats_new_contributions.rst | 8 +-
.../gitwash/development_workflow.rst | 4 +-
.../developers_guide/gitwash/forking_hell.rst | 4 +-
.../gitwash/git_development.rst | 2 -
.../developers_guide/gitwash/git_install.rst | 6 +-
.../developers_guide/gitwash/git_links.inc | 1 -
.../gitwash/git_resources.rst | 6 +-
.../src/developers_guide/gitwash/index.rst | 2 -
.../src/developers_guide/graphics_tests.rst | 31 +-
docs/iris/src/developers_guide/index.rst | 19 -
docs/iris/src/developers_guide/pulls.rst | 12 +-
docs/iris/src/developers_guide/release.rst | 14 +-
docs/iris/src/developers_guide/tests.rst | 1 +
docs/iris/src/index.rst | 87 ++
docs/iris/src/installing.rst | 3 +-
docs/iris/src/sphinxext/auto_label_figures.py | 25 -
.../src/sphinxext/custom_class_autodoc.py | 7 +-
.../iris/src/sphinxext/custom_data_autodoc.py | 2 +-
.../src/sphinxext/gen_example_directory.py | 168 ---
docs/iris/src/sphinxext/gen_gallery.py | 201 ---
.../src/sphinxext/generate_package_rst.py | 67 +-
.../change_management.rst | 28 +-
.../src/{whitepapers => techpapers}/index.rst | 9 +-
.../missing_data_handling.rst | 0
.../um_files_loading.rst | 0
docs/iris/src/userguide/citation.rst | 4 +-
docs/iris/src/userguide/code_maintenance.rst | 6 +-
docs/iris/src/userguide/cube_maths.rst | 2 +-
docs/iris/src/userguide/cube_statistics.rst | 5 +-
docs/iris/src/userguide/end_of_userguide.rst | 15 -
docs/iris/src/userguide/index.rst | 42 +-
docs/iris/src/userguide/iris_cubes.rst | 11 +-
.../iris/src/userguide/loading_iris_cubes.rst | 2 +
docs/iris/src/userguide/merge_and_concat.rst | 2 +-
docs/iris/src/userguide/plotting_a_cube.rst | 6 +-
.../plotting_examples/1d_quickplot_simple.py | 1 +
.../userguide/plotting_examples/1d_simple.py | 1 +
.../plotting_examples/1d_with_legend.py | 1 -
.../src/userguide/plotting_examples/brewer.py | 39 +-
.../plotting_examples/cube_blockplot.py | 1 -
.../cube_brewer_cite_contourf.py | 1 -
docs/iris/src/userguide/saving_iris_cubes.rst | 2 +-
docs/iris/src/whatsnew/1.0.rst | 21 +-
docs/iris/src/whatsnew/1.10.rst | 10 +-
docs/iris/src/whatsnew/1.11.rst | 8 +-
docs/iris/src/whatsnew/1.12.rst | 6 +-
docs/iris/src/whatsnew/1.13.rst | 6 +-
docs/iris/src/whatsnew/1.4.rst | 4 +-
docs/iris/src/whatsnew/1.5.rst | 2 +-
docs/iris/src/whatsnew/1.7.rst | 13 +-
docs/iris/src/whatsnew/1.8.rst | 2 +-
docs/iris/src/whatsnew/1.9.rst | 10 +-
docs/iris/src/whatsnew/2.0.rst | 8 +-
docs/iris/src/whatsnew/2.1.rst | 10 +-
docs/iris/src/whatsnew/2.2.rst | 10 +-
docs/iris/src/whatsnew/2.3.rst | 46 +-
docs/iris/src/whatsnew/2.4.rst | 8 +-
docs/iris/src/whatsnew/aggregate_directory.py | 4 +-
..._2020-Jan-31_nimrod_format_enhancement.txt | 4 +-
docs/iris/src/whatsnew/index.rst | 4 +-
lib/iris/_constraints.py | 4 +-
lib/iris/analysis/__init__.py | 13 +-
lib/iris/analysis/stats.py | 2 +-
lib/iris/cube.py | 2 +
lib/iris/experimental/stratify.py | 4 +-
lib/iris/fileformats/cf.py | 2 +-
lib/iris/fileformats/netcdf.py | 14 +-
lib/iris/tests/__init__.py | 2 +-
lib/iris/tests/results/imagerepo.json | 68 +-
lib/iris/tests/runner/_runner.py | 22 +-
lib/iris/tests/test_coding_standards.py | 5 +-
requirements/docs.txt | 3 +
setup.py | 1 -
tools/generate_std_names.py | 9 +-
157 files changed, 1253 insertions(+), 2895 deletions(-)
create mode 100644 .readthedocs.yml
create mode 100644 ci/requirements/readthedocs-conda.yml
create mode 100644 docs/iris/gallery_code/README.rst
create mode 100644 docs/iris/gallery_code/general/README.rst
rename docs/iris/{example_code/General => gallery_code/general}/__init__.py (100%)
rename docs/iris/{example_code/General/SOI_filtering.py => gallery_code/general/plot_SOI_filtering.py} (100%)
rename docs/iris/{example_code/General/anomaly_log_colouring.py => gallery_code/general/plot_anomaly_log_colouring.py} (97%)
rename docs/iris/{example_code/General/coriolis_plot.py => gallery_code/general/plot_coriolis.py} (100%)
rename docs/iris/{example_code/General/cross_section.py => gallery_code/general/plot_cross_section.py} (100%)
rename docs/iris/{example_code/General/custom_aggregation.py => gallery_code/general/plot_custom_aggregation.py} (100%)
rename docs/iris/{example_code/General/custom_file_loading.py => gallery_code/general/plot_custom_file_loading.py} (100%)
rename docs/iris/{example_code/General/global_map.py => gallery_code/general/plot_global_map.py} (100%)
rename docs/iris/{example_code/General/inset_plot.py => gallery_code/general/plot_inset.py} (100%)
rename docs/iris/{example_code/General/lineplot_with_legend.py => gallery_code/general/plot_lineplot_with_legend.py} (100%)
rename docs/iris/{example_code/General/orca_projection.py => gallery_code/general/plot_orca_projection.py} (100%)
rename docs/iris/{example_code/General/polar_stereo.py => gallery_code/general/plot_polar_stereo.py} (100%)
rename docs/iris/{example_code/General/polynomial_fit.py => gallery_code/general/plot_polynomial_fit.py} (100%)
rename docs/iris/{example_code/General/projections_and_annotations.py => gallery_code/general/plot_projections_and_annotations.py} (100%)
rename docs/iris/{example_code/General/rotated_pole_mapping.py => gallery_code/general/plot_rotated_pole_mapping.py} (100%)
create mode 100644 docs/iris/gallery_code/meteorology/README.rst
rename docs/iris/{example_code/Meteorology => gallery_code/meteorology}/__init__.py (100%)
rename docs/iris/{example_code/Meteorology/COP_1d_plot.py => gallery_code/meteorology/plot_COP_1d.py} (100%)
rename docs/iris/{example_code/Meteorology/COP_maps.py => gallery_code/meteorology/plot_COP_maps.py} (100%)
rename docs/iris/{example_code/Meteorology/TEC.py => gallery_code/meteorology/plot_TEC.py} (100%)
rename docs/iris/{example_code/Meteorology/deriving_phenomena.py => gallery_code/meteorology/plot_deriving_phenomena.py} (100%)
rename docs/iris/{example_code/Meteorology/hovmoller.py => gallery_code/meteorology/plot_hovmoller.py} (100%)
rename docs/iris/{example_code/Meteorology/lagged_ensemble.py => gallery_code/meteorology/plot_lagged_ensemble.py} (100%)
rename docs/iris/{example_code/Meteorology/wind_speed.py => gallery_code/meteorology/plot_wind_speed.py} (100%)
create mode 100644 docs/iris/gallery_code/oceanography/README.rst
rename docs/iris/{example_code/Oceanography => gallery_code/oceanography}/__init__.py (100%)
rename docs/iris/{example_code/Oceanography/atlantic_profiles.py => gallery_code/oceanography/plot_atlantic_profiles.py} (100%)
rename docs/iris/{example_code/Oceanography/load_nemo.py => gallery_code/oceanography/plot_load_nemo.py} (100%)
rename docs/iris/{example_tests => gallery_tests}/__init__.py (100%)
rename docs/iris/{example_tests/extest_util.py => gallery_tests/gallerytest_util.py} (84%)
rename docs/iris/{example_tests/test_COP_1d_plot.py => gallery_tests/test_plot_COP_1d.py} (70%)
rename docs/iris/{example_tests/test_COP_maps.py => gallery_tests/test_plot_COP_maps.py} (70%)
rename docs/iris/{example_tests/test_SOI_filtering.py => gallery_tests/test_plot_SOI_filtering.py} (68%)
rename docs/iris/{example_tests/test_TEC.py => gallery_tests/test_plot_TEC.py} (71%)
rename docs/iris/{example_tests/test_anomaly_log_colouring.py => gallery_tests/test_plot_anomaly_log_colouring.py} (66%)
rename docs/iris/{example_tests/test_atlantic_profiles.py => gallery_tests/test_plot_atlantic_profiles.py} (67%)
rename docs/iris/{example_tests/test_coriolis_plot.py => gallery_tests/test_plot_coriolis.py} (59%)
rename docs/iris/{example_tests/test_cross_section.py => gallery_tests/test_plot_cross_section.py} (68%)
rename docs/iris/{example_tests/test_custom_aggregation.py => gallery_tests/test_plot_custom_aggregation.py} (67%)
rename docs/iris/{example_tests/test_custom_file_loading.py => gallery_tests/test_plot_custom_file_loading.py} (67%)
rename docs/iris/{example_tests/test_deriving_phenomena.py => gallery_tests/test_plot_deriving_phenomena.py} (67%)
rename docs/iris/{example_tests/test_hovmoller.py => gallery_tests/test_plot_global_map.py} (69%)
rename docs/iris/{example_tests/test_global_map.py => gallery_tests/test_plot_hovmoller.py} (69%)
rename docs/iris/{example_tests/test_inset_plot.py => gallery_tests/test_plot_inset.py} (70%)
rename docs/iris/{example_tests/test_lagged_ensemble.py => gallery_tests/test_plot_lagged_ensemble.py} (68%)
rename docs/iris/{example_tests/test_lineplot_with_legend.py => gallery_tests/test_plot_lineplot_with_legend.py} (66%)
rename docs/iris/{example_tests/test_load_nemo.py => gallery_tests/test_plot_load_nemo.py} (69%)
rename docs/iris/{example_tests/test_orca_projection.py => gallery_tests/test_plot_orca_projection.py} (68%)
rename docs/iris/{example_tests/test_polar_stereo.py => gallery_tests/test_plot_polar_stereo.py} (69%)
rename docs/iris/{example_tests/test_polynomial_fit.py => gallery_tests/test_plot_polynomial_fit.py} (68%)
rename docs/iris/{example_tests/test_projections_and_annotations.py => gallery_tests/test_plot_projections_and_annotations.py} (65%)
rename docs/iris/{example_tests/test_rotated_pole_mapping.py => gallery_tests/test_plot_rotated_pole_mapping.py} (66%)
rename docs/iris/{example_tests/test_wind_speed.py => gallery_tests/test_plot_wind_speed.py} (69%)
delete mode 100644 docs/iris/src/_static/copybutton.js
delete mode 100644 docs/iris/src/_static/favicon-16x16.png
delete mode 100644 docs/iris/src/_static/favicon-32x32.png
create mode 100644 docs/iris/src/_static/favicon.ico
create mode 100644 docs/iris/src/_static/iris-logo-title.png
create mode 100644 docs/iris/src/_static/iris-logo-title.svg
delete mode 100755 docs/iris/src/_static/iris_colour_logo_centred.png
delete mode 100644 docs/iris/src/_static/jquery.cycle.all.latest.js
delete mode 100644 docs/iris/src/_static/logo_banner.png
delete mode 100644 docs/iris/src/_static/style.css
create mode 100644 docs/iris/src/_static/theme_override.css
delete mode 100644 docs/iris/src/_templates/index.html
delete mode 100644 docs/iris/src/contents.rst
create mode 100644 docs/iris/src/developers_guide/contributing_documentation.rst
delete mode 100644 docs/iris/src/developers_guide/index.rst
create mode 100644 docs/iris/src/index.rst
delete mode 100644 docs/iris/src/sphinxext/auto_label_figures.py
delete mode 100644 docs/iris/src/sphinxext/gen_example_directory.py
delete mode 100644 docs/iris/src/sphinxext/gen_gallery.py
rename docs/iris/src/{whitepapers => techpapers}/change_management.rst (96%)
rename docs/iris/src/{whitepapers => techpapers}/index.rst (54%)
rename docs/iris/src/{whitepapers => techpapers}/missing_data_handling.rst (100%)
rename docs/iris/src/{whitepapers => techpapers}/um_files_loading.rst (100%)
delete mode 100644 docs/iris/src/userguide/end_of_userguide.rst
diff --git a/.gitignore b/.gitignore
index 48cddc53be..d589c306fe 100644
--- a/.gitignore
+++ b/.gitignore
@@ -55,11 +55,8 @@ lib/iris/tests/results/imagerepo.lock
*.cover
# Auto generated documentation files
-docs/iris/src/_static/random_image.js
-docs/iris/src/_templates/gallery.html
-docs/iris/src/examples/
-docs/iris/src/iris/
-docs/iris/src/matplotlibrc
+docs/iris/src/_build/*
+docs/iris/src/generated
# Example test results
docs/iris/iris_image_test_output/
diff --git a/.readthedocs.yml b/.readthedocs.yml
new file mode 100644
index 0000000000..6ed3dab9c7
--- /dev/null
+++ b/.readthedocs.yml
@@ -0,0 +1,19 @@
+version: 2
+
+build:
+ image: latest
+
+conda:
+ environment: ci/requirements/readthedocs-conda.yml
+
+sphinx:
+ configuration: docs/iris/src/conf.py
+ fail_on_warning: false
+
+python:
+ install:
+ - method: setuptools
+ path: .
+
+formats:
+ - htmlzip
diff --git a/.travis.yml b/.travis.yml
index ca47a73388..262e8d7791 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -15,12 +15,12 @@ env:
matrix:
- PYTHON_VERSION=3.6 TEST_TARGET=default TEST_MINIMAL=true
- PYTHON_VERSION=3.6 TEST_TARGET=default TEST_BLACK=true
- - PYTHON_VERSION=3.6 TEST_TARGET=example
-
+ - PYTHON_VERSION=3.6 TEST_TARGET=gallery
- PYTHON_VERSION=3.7 TEST_TARGET=default TEST_MINIMAL=true
- PYTHON_VERSION=3.7 TEST_TARGET=default TEST_BLACK=true
- - PYTHON_VERSION=3.7 TEST_TARGET=example
+ - PYTHON_VERSION=3.7 TEST_TARGET=gallery
- PYTHON_VERSION=3.7 TEST_TARGET=doctest PUSH_BUILT_DOCS=true
+ - PYTHON_VERSION=3.7 TEST_TARGET=linkcheck
git:
# We need a deep clone so that we can compute the age of the files using their git history.
@@ -61,8 +61,8 @@ install:
if [[ "${TEST_MINIMAL}" != true ]]; then
CONDA_REQS_GROUPS="${CONDA_REQS_GROUPS} all";
fi;
- if [[ "${TEST_TARGET}" == 'doctest' ]]; then
- CONDA_REQS_GROUPS="${CONDA_REQS_GROUPS} docs";
+ if [[ "${TEST_TARGET}" == 'doctest' || "${TEST_TARGET}" == 'linkcheck' ]]; then
+ CONDA_REQS_GROUPS="${CONDA_REQS_GROUPS} docs";
fi;
CONDA_REQS_FILE="conda-requirements.txt";
python requirements/gen_conda_requirements.py --groups ${CONDA_REQS_GROUPS} > ${CONDA_REQS_FILE};
@@ -118,8 +118,8 @@ script:
python -m iris.tests.runner --default-tests --system-tests;
fi
- - if [[ "${TEST_TARGET}" == 'example' ]]; then
- python -m iris.tests.runner --example-tests;
+ - if [[ "${TEST_TARGET}" == 'gallery' ]]; then
+ python -m iris.tests.runner --gallery-tests;
fi
# A call to check "whatsnew" contributions are valid, because the Iris test
@@ -152,6 +152,17 @@ script:
make clean html && make doctest;
fi
+ # check the links in the docs
+ - >
+ if [[ "${TEST_TARGET}" == 'linkcheck' ]]; then
+ MPL_RC_DIR="${HOME}/.config/matplotlib";
+ mkdir -p ${MPL_RC_DIR};
+ echo 'backend : agg' > ${MPL_RC_DIR}/matplotlibrc;
+ echo 'image.cmap : viridis' >> ${MPL_RC_DIR}/matplotlibrc;
+ cd ${INSTALL_DIR}/docs/iris;
+ make clean && make linkcheck;
+ fi
+
# Split the organisation out of the slug. See https://stackoverflow.com/a/5257398/741316 for description.
# NOTE: a *separate* "export" command appears to be necessary here : A command of the
# form "export ORG=.." failed to define ORG for the following command (?!)
diff --git a/INSTALL b/INSTALL
index 9296f97a29..cf4c4d1bae 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,9 +1,11 @@
You can either install Iris using the conda package manager or from source.
+
Installing using conda
----------------------
Iris is available using conda for the following platforms:
+
* Linux 64-bit,
* Mac OSX 64-bit, and
* Windows 32-bit and 64-bit.
@@ -16,8 +18,7 @@ the following command::
conda install -c conda-forge iris
-If you wish to run any of the code examples
-(see http://scitools.org.uk/iris/docs/latest/examples/index.html) you will also
+If you wish to run any of the code in the gallery you will also
need the Iris sample data. This can also be installed using conda::
conda install -c conda-forge iris-sample-data
@@ -77,7 +78,7 @@ Hence the commands change to::
conda activate my_iris_env # or whatever other name you gave it
pip install -e .
-The tests can then be run with
+The tests can then be run with::
python setup.py test
diff --git a/README.md b/README.md
index ee7a170822..126869b267 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,9 @@
-
- 
+
+ 
+
Iris is a powerful, format-agnostic, community-driven Python library for
analysing and visualising Earth science data
diff --git a/ci/requirements/readthedocs-conda.yml b/ci/requirements/readthedocs-conda.yml
new file mode 100644
index 0000000000..611c69307d
--- /dev/null
+++ b/ci/requirements/readthedocs-conda.yml
@@ -0,0 +1,60 @@
+name: iris-docs
+
+channels:
+ - conda-forge
+
+dependencies:
+# Dependencies necessary to run setup.py of iris
+# ----------------------------------------------
+ - setuptools
+ - pyke
+
+# Absolute minimal dependencies for iris
+# --------------------------------------
+
+# Without these, iris won't even import.
+
+ - cartopy>=0.12
+ - proj4<6
+ - cf-units>=2
+ - cftime==1.1.3
+ - dask>=2
+ - matplotlib
+ - netcdf4
+ - numpy>=1.14
+ - scipy
+
+# Dependencies needed to run the iris tests
+#------------------------------------------
+
+ - black=19.10b0
+ - filelock
+ - pillow<7
+ - imagehash>=4.0
+ - nose
+ - pre-commit
+ - requests
+ - asv
+
+# Dependencies for a feature complete installation
+# ------------------------------------------------
+
+# esmpy regridding not available through pip.
+ - esmpy>=7.0
+#gdal : under review -- not tested at present
+ - mo_pack
+ - nc-time-axis
+ - pandas
+ - python-stratify
+ - pyugrid
+
+ - graphviz
+
+# Iris sample data is not available through pip. It can be installed from
+# https://github.com/SciTools/iris-sample-data/archive/master.zip
+ - iris-sample-data
+ - sphinx
+ - sphinx_rtd_theme
+ - sphinx-copybutton
+ - sphinx-gallery
+
diff --git a/docs/iris/Makefile b/docs/iris/Makefile
index 1a66b03805..a220502028 100644
--- a/docs/iris/Makefile
+++ b/docs/iris/Makefile
@@ -20,28 +20,36 @@ pdf:
all:
@for i in $(SUBDIRS); do \
- echo "make all in $$i..."; \
- (cd $$i; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) all); done
+ echo "make all in $$i..."; \
+ (cd $$i; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) all); done
+
install:
@for i in $(SUBDIRS); do \
- echo "Installing in $$i..."; \
- (cd $$i; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) install); done
+ echo "Installing in $$i..."; \
+ (cd $$i; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) install); done
+
build:
@for i in $(SUBDIRS); do \
- echo "Clearing in $$i..."; \
- (cd $$i; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) build); done
+ echo "Clearing in $$i..."; \
+ (cd $$i; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) build); done
+
clean:
@for i in $(SUBDIRS); do \
- echo "Clearing in $$i..."; \
- (cd $$i; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) clean); done
+ echo "Clearing in $$i..."; \
+ (cd $$i; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) clean); done
doctest:
@for i in $(SUBDIRS); do \
echo "Running doctest in $$i..."; \
(cd $$i; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) doctest); done
-extest:
+linkcheck:
+ @for i in $(SUBDIRS); do \
+ echo "Running linkcheck in $$i..."; \
+ (cd $$i; $(MAKE) $(MFLAGS) $(MYMAKEFLAGS) linkcheck); done
+
+gallerytest:
@echo
- @echo "Running \"example_code/graphics\" tests..."
+ @echo "Running \"gallery\" tests..."
@echo
python -m unittest discover -v -t .
diff --git a/docs/iris/gallery_code/README.rst b/docs/iris/gallery_code/README.rst
new file mode 100644
index 0000000000..7d8fb60e81
--- /dev/null
+++ b/docs/iris/gallery_code/README.rst
@@ -0,0 +1,26 @@
+Gallery
+=======
+
+The gallery is divided into sections as described below. All entries
+show the code used to produce the example plot. Additionally there are links
+to download the code directly as source or as part of a
+`jupyter notebook `_,
+these links are at the bottom of the page.
+
+In order to successfuly view the jupyter notebook locally so you may
+experiment with the code you will need an environment setup with the
+appropriate dependencies, see :ref:`installing_iris` for instructions.
+Ensure that ``iris-sample-data`` is installed as it is used in the gallery.
+Additionally ensure that you install ``jupyter``. The command to install both
+is::
+
+ conda install -c conda-forge iris-sample-data jupyter
+
+Once you have downloaded the notebooks (bottom of each gallery page),
+you may start the jupyter notebook via::
+
+ jupyter notebook
+
+If you wish to contribute to the gallery see the
+:ref:`contributing.documentation.gallery` section of the
+:ref:`contributing.documentation`.
diff --git a/docs/iris/gallery_code/general/README.rst b/docs/iris/gallery_code/general/README.rst
new file mode 100644
index 0000000000..c846755f1e
--- /dev/null
+++ b/docs/iris/gallery_code/general/README.rst
@@ -0,0 +1,2 @@
+General
+-------
diff --git a/docs/iris/example_code/General/__init__.py b/docs/iris/gallery_code/general/__init__.py
similarity index 100%
rename from docs/iris/example_code/General/__init__.py
rename to docs/iris/gallery_code/general/__init__.py
diff --git a/docs/iris/example_code/General/SOI_filtering.py b/docs/iris/gallery_code/general/plot_SOI_filtering.py
similarity index 100%
rename from docs/iris/example_code/General/SOI_filtering.py
rename to docs/iris/gallery_code/general/plot_SOI_filtering.py
diff --git a/docs/iris/example_code/General/anomaly_log_colouring.py b/docs/iris/gallery_code/general/plot_anomaly_log_colouring.py
similarity index 97%
rename from docs/iris/example_code/General/anomaly_log_colouring.py
rename to docs/iris/gallery_code/general/plot_anomaly_log_colouring.py
index 95af1e1f61..28f7ce323b 100644
--- a/docs/iris/example_code/General/anomaly_log_colouring.py
+++ b/docs/iris/gallery_code/general/plot_anomaly_log_colouring.py
@@ -13,7 +13,7 @@
To do this, we create a custom value mapping function (normalization) using
the matplotlib Norm class `matplotlib.colours.SymLogNorm
-`_.
+`_.
We use this to make a cell-filled pseudocolour plot with a colorbar.
NOTE: By "pseudocolour", we mean that each data point is drawn as a "cell"
diff --git a/docs/iris/example_code/General/coriolis_plot.py b/docs/iris/gallery_code/general/plot_coriolis.py
similarity index 100%
rename from docs/iris/example_code/General/coriolis_plot.py
rename to docs/iris/gallery_code/general/plot_coriolis.py
diff --git a/docs/iris/example_code/General/cross_section.py b/docs/iris/gallery_code/general/plot_cross_section.py
similarity index 100%
rename from docs/iris/example_code/General/cross_section.py
rename to docs/iris/gallery_code/general/plot_cross_section.py
diff --git a/docs/iris/example_code/General/custom_aggregation.py b/docs/iris/gallery_code/general/plot_custom_aggregation.py
similarity index 100%
rename from docs/iris/example_code/General/custom_aggregation.py
rename to docs/iris/gallery_code/general/plot_custom_aggregation.py
diff --git a/docs/iris/example_code/General/custom_file_loading.py b/docs/iris/gallery_code/general/plot_custom_file_loading.py
similarity index 100%
rename from docs/iris/example_code/General/custom_file_loading.py
rename to docs/iris/gallery_code/general/plot_custom_file_loading.py
diff --git a/docs/iris/example_code/General/global_map.py b/docs/iris/gallery_code/general/plot_global_map.py
similarity index 100%
rename from docs/iris/example_code/General/global_map.py
rename to docs/iris/gallery_code/general/plot_global_map.py
diff --git a/docs/iris/example_code/General/inset_plot.py b/docs/iris/gallery_code/general/plot_inset.py
similarity index 100%
rename from docs/iris/example_code/General/inset_plot.py
rename to docs/iris/gallery_code/general/plot_inset.py
diff --git a/docs/iris/example_code/General/lineplot_with_legend.py b/docs/iris/gallery_code/general/plot_lineplot_with_legend.py
similarity index 100%
rename from docs/iris/example_code/General/lineplot_with_legend.py
rename to docs/iris/gallery_code/general/plot_lineplot_with_legend.py
diff --git a/docs/iris/example_code/General/orca_projection.py b/docs/iris/gallery_code/general/plot_orca_projection.py
similarity index 100%
rename from docs/iris/example_code/General/orca_projection.py
rename to docs/iris/gallery_code/general/plot_orca_projection.py
diff --git a/docs/iris/example_code/General/polar_stereo.py b/docs/iris/gallery_code/general/plot_polar_stereo.py
similarity index 100%
rename from docs/iris/example_code/General/polar_stereo.py
rename to docs/iris/gallery_code/general/plot_polar_stereo.py
diff --git a/docs/iris/example_code/General/polynomial_fit.py b/docs/iris/gallery_code/general/plot_polynomial_fit.py
similarity index 100%
rename from docs/iris/example_code/General/polynomial_fit.py
rename to docs/iris/gallery_code/general/plot_polynomial_fit.py
diff --git a/docs/iris/example_code/General/projections_and_annotations.py b/docs/iris/gallery_code/general/plot_projections_and_annotations.py
similarity index 100%
rename from docs/iris/example_code/General/projections_and_annotations.py
rename to docs/iris/gallery_code/general/plot_projections_and_annotations.py
diff --git a/docs/iris/example_code/General/rotated_pole_mapping.py b/docs/iris/gallery_code/general/plot_rotated_pole_mapping.py
similarity index 100%
rename from docs/iris/example_code/General/rotated_pole_mapping.py
rename to docs/iris/gallery_code/general/plot_rotated_pole_mapping.py
diff --git a/docs/iris/gallery_code/meteorology/README.rst b/docs/iris/gallery_code/meteorology/README.rst
new file mode 100644
index 0000000000..e8e902b498
--- /dev/null
+++ b/docs/iris/gallery_code/meteorology/README.rst
@@ -0,0 +1,3 @@
+Meteorology
+-----------
+
diff --git a/docs/iris/example_code/Meteorology/__init__.py b/docs/iris/gallery_code/meteorology/__init__.py
similarity index 100%
rename from docs/iris/example_code/Meteorology/__init__.py
rename to docs/iris/gallery_code/meteorology/__init__.py
diff --git a/docs/iris/example_code/Meteorology/COP_1d_plot.py b/docs/iris/gallery_code/meteorology/plot_COP_1d.py
similarity index 100%
rename from docs/iris/example_code/Meteorology/COP_1d_plot.py
rename to docs/iris/gallery_code/meteorology/plot_COP_1d.py
diff --git a/docs/iris/example_code/Meteorology/COP_maps.py b/docs/iris/gallery_code/meteorology/plot_COP_maps.py
similarity index 100%
rename from docs/iris/example_code/Meteorology/COP_maps.py
rename to docs/iris/gallery_code/meteorology/plot_COP_maps.py
diff --git a/docs/iris/example_code/Meteorology/TEC.py b/docs/iris/gallery_code/meteorology/plot_TEC.py
similarity index 100%
rename from docs/iris/example_code/Meteorology/TEC.py
rename to docs/iris/gallery_code/meteorology/plot_TEC.py
diff --git a/docs/iris/example_code/Meteorology/deriving_phenomena.py b/docs/iris/gallery_code/meteorology/plot_deriving_phenomena.py
similarity index 100%
rename from docs/iris/example_code/Meteorology/deriving_phenomena.py
rename to docs/iris/gallery_code/meteorology/plot_deriving_phenomena.py
diff --git a/docs/iris/example_code/Meteorology/hovmoller.py b/docs/iris/gallery_code/meteorology/plot_hovmoller.py
similarity index 100%
rename from docs/iris/example_code/Meteorology/hovmoller.py
rename to docs/iris/gallery_code/meteorology/plot_hovmoller.py
diff --git a/docs/iris/example_code/Meteorology/lagged_ensemble.py b/docs/iris/gallery_code/meteorology/plot_lagged_ensemble.py
similarity index 100%
rename from docs/iris/example_code/Meteorology/lagged_ensemble.py
rename to docs/iris/gallery_code/meteorology/plot_lagged_ensemble.py
diff --git a/docs/iris/example_code/Meteorology/wind_speed.py b/docs/iris/gallery_code/meteorology/plot_wind_speed.py
similarity index 100%
rename from docs/iris/example_code/Meteorology/wind_speed.py
rename to docs/iris/gallery_code/meteorology/plot_wind_speed.py
diff --git a/docs/iris/gallery_code/oceanography/README.rst b/docs/iris/gallery_code/oceanography/README.rst
new file mode 100644
index 0000000000..0f3adf906b
--- /dev/null
+++ b/docs/iris/gallery_code/oceanography/README.rst
@@ -0,0 +1,3 @@
+Oceanography
+------------
+
diff --git a/docs/iris/example_code/Oceanography/__init__.py b/docs/iris/gallery_code/oceanography/__init__.py
similarity index 100%
rename from docs/iris/example_code/Oceanography/__init__.py
rename to docs/iris/gallery_code/oceanography/__init__.py
diff --git a/docs/iris/example_code/Oceanography/atlantic_profiles.py b/docs/iris/gallery_code/oceanography/plot_atlantic_profiles.py
similarity index 100%
rename from docs/iris/example_code/Oceanography/atlantic_profiles.py
rename to docs/iris/gallery_code/oceanography/plot_atlantic_profiles.py
diff --git a/docs/iris/example_code/Oceanography/load_nemo.py b/docs/iris/gallery_code/oceanography/plot_load_nemo.py
similarity index 100%
rename from docs/iris/example_code/Oceanography/load_nemo.py
rename to docs/iris/gallery_code/oceanography/plot_load_nemo.py
diff --git a/docs/iris/example_tests/__init__.py b/docs/iris/gallery_tests/__init__.py
similarity index 100%
rename from docs/iris/example_tests/__init__.py
rename to docs/iris/gallery_tests/__init__.py
diff --git a/docs/iris/example_tests/extest_util.py b/docs/iris/gallery_tests/gallerytest_util.py
similarity index 84%
rename from docs/iris/example_tests/extest_util.py
rename to docs/iris/gallery_tests/gallerytest_util.py
index c96f47ae50..38678fdb18 100644
--- a/docs/iris/example_tests/extest_util.py
+++ b/docs/iris/gallery_tests/gallerytest_util.py
@@ -6,7 +6,7 @@
"""
Provides context managers which are fundamental to the ability
-to run the example tests.
+to run the gallery tests.
"""
@@ -23,26 +23,26 @@
import iris.quickplot as qplt
-EXAMPLE_DIRECTORY = os.path.join(
- os.path.dirname(os.path.dirname(__file__)), "example_code"
+GALLERY_DIRECTORY = os.path.join(
+ os.path.dirname(os.path.dirname(__file__)), "gallery_code"
)
-EXAMPLE_DIRECTORIES = [
- os.path.join(EXAMPLE_DIRECTORY, the_dir)
- for the_dir in os.listdir(EXAMPLE_DIRECTORY)
+GALLERY_DIRECTORIES = [
+ os.path.join(GALLERY_DIRECTORY, the_dir)
+ for the_dir in os.listdir(GALLERY_DIRECTORY)
]
@contextlib.contextmanager
-def add_examples_to_path():
+def add_gallery_to_path():
"""
- Creates a context manager which can be used to add the iris examples
- to the PYTHONPATH. The examples are only importable throughout the lifetime
+ Creates a context manager which can be used to add the iris gallery
+ to the PYTHONPATH. The gallery entries are only importable throughout the lifetime
of this context manager.
"""
orig_sys_path = sys.path
sys.path = sys.path[:]
- sys.path += EXAMPLE_DIRECTORIES
+ sys.path += GALLERY_DIRECTORIES
yield
sys.path = orig_sys_path
diff --git a/docs/iris/example_tests/test_COP_1d_plot.py b/docs/iris/gallery_tests/test_plot_COP_1d.py
similarity index 70%
rename from docs/iris/example_tests/test_COP_1d_plot.py
rename to docs/iris/gallery_tests/test_plot_COP_1d.py
index d0e989a3f2..7ad59ba10b 100644
--- a/docs/iris/example_tests/test_COP_1d_plot.py
+++ b/docs/iris/gallery_tests/test_plot_COP_1d.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestCOP1DPlot(tests.GraphicsTest):
- """Test the COP_1d_plot example code."""
+ """Test the COP_1d_plot gallery code."""
- def test_COP_1d_plot(self):
+ def test_plot_COP_1d(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import COP_1d_plot
+ with add_gallery_to_path():
+ import plot_COP_1d
with show_replaced_by_check_graphic(self):
- COP_1d_plot.main()
+ plot_COP_1d.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_COP_maps.py b/docs/iris/gallery_tests/test_plot_COP_maps.py
similarity index 70%
rename from docs/iris/example_tests/test_COP_maps.py
rename to docs/iris/gallery_tests/test_plot_COP_maps.py
index 9db5060c89..5252ddfe6f 100644
--- a/docs/iris/example_tests/test_COP_maps.py
+++ b/docs/iris/gallery_tests/test_plot_COP_maps.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestCOPMaps(tests.GraphicsTest):
- """Test the COP_maps example code."""
+ """Test the COP_maps gallery code."""
- def test_cop_maps(self):
+ def test_plot_cop_maps(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import COP_maps
+ with add_gallery_to_path():
+ import plot_COP_maps
with show_replaced_by_check_graphic(self):
- COP_maps.main()
+ plot_COP_maps.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_SOI_filtering.py b/docs/iris/gallery_tests/test_plot_SOI_filtering.py
similarity index 68%
rename from docs/iris/example_tests/test_SOI_filtering.py
rename to docs/iris/gallery_tests/test_plot_SOI_filtering.py
index 2d791567b0..384a44ebd8 100644
--- a/docs/iris/example_tests/test_SOI_filtering.py
+++ b/docs/iris/gallery_tests/test_plot_SOI_filtering.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestSOIFiltering(tests.GraphicsTest):
- """Test the SOI_filtering example code."""
+ """Test the SOI_filtering gallery code."""
- def test_soi_filtering(self):
+ def test_plot_soi_filtering(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import SOI_filtering
+ with add_gallery_to_path():
+ import plot_SOI_filtering
with show_replaced_by_check_graphic(self):
- SOI_filtering.main()
+ plot_SOI_filtering.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_TEC.py b/docs/iris/gallery_tests/test_plot_TEC.py
similarity index 71%
rename from docs/iris/example_tests/test_TEC.py
rename to docs/iris/gallery_tests/test_plot_TEC.py
index 4bcd70f9f5..2852ab06b9 100644
--- a/docs/iris/example_tests/test_TEC.py
+++ b/docs/iris/gallery_tests/test_plot_TEC.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestTEC(tests.GraphicsTest):
- """Test the TEC example code."""
+ """Test the TEC gallery code."""
- def test_TEC(self):
+ def test_plot_TEC(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import TEC
+ with add_gallery_to_path():
+ import plot_TEC
with show_replaced_by_check_graphic(self):
- TEC.main()
+ plot_TEC.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_anomaly_log_colouring.py b/docs/iris/gallery_tests/test_plot_anomaly_log_colouring.py
similarity index 66%
rename from docs/iris/example_tests/test_anomaly_log_colouring.py
rename to docs/iris/gallery_tests/test_plot_anomaly_log_colouring.py
index d0f07b02c4..eaae11f6b5 100644
--- a/docs/iris/example_tests/test_anomaly_log_colouring.py
+++ b/docs/iris/gallery_tests/test_plot_anomaly_log_colouring.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestAnomalyLogColouring(tests.GraphicsTest):
- """Test the anomaly colouring example code."""
+ """Test the anomaly colouring gallery code."""
- def test_anomaly_log_colouring(self):
+ def test_plot_anomaly_log_colouring(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import anomaly_log_colouring
+ with add_gallery_to_path():
+ import plot_anomaly_log_colouring
with show_replaced_by_check_graphic(self):
- anomaly_log_colouring.main()
+ plot_anomaly_log_colouring.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_atlantic_profiles.py b/docs/iris/gallery_tests/test_plot_atlantic_profiles.py
similarity index 67%
rename from docs/iris/example_tests/test_atlantic_profiles.py
rename to docs/iris/gallery_tests/test_plot_atlantic_profiles.py
index d85dc72c2c..b69408337b 100644
--- a/docs/iris/example_tests/test_atlantic_profiles.py
+++ b/docs/iris/gallery_tests/test_plot_atlantic_profiles.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestAtlanticProfiles(tests.GraphicsTest):
- """Test the atlantic_profiles example code."""
+ """Test the atlantic_profiles gallery code."""
- def test_atlantic_profiles(self):
+ def test_plot_atlantic_profiles(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import atlantic_profiles
+ with add_gallery_to_path():
+ import plot_atlantic_profiles
with show_replaced_by_check_graphic(self):
- atlantic_profiles.main()
+ plot_atlantic_profiles.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_coriolis_plot.py b/docs/iris/gallery_tests/test_plot_coriolis.py
similarity index 59%
rename from docs/iris/example_tests/test_coriolis_plot.py
rename to docs/iris/gallery_tests/test_plot_coriolis.py
index e61fdce81d..2e4cea8a74 100644
--- a/docs/iris/example_tests/test_coriolis_plot.py
+++ b/docs/iris/gallery_tests/test_plot_coriolis.py
@@ -9,18 +9,18 @@
import iris.tests as tests
-from . import extest_util
+from . import gallerytest_util
-with extest_util.add_examples_to_path():
- import coriolis_plot
+with gallerytest_util.add_gallery_to_path():
+ import plot_coriolis
class TestCoriolisPlot(tests.GraphicsTest):
- """Test the Coriolis Plot example code."""
+ """Test the Coriolis Plot gallery code."""
- def test_coriolis_plot(self):
- with extest_util.show_replaced_by_check_graphic(self):
- coriolis_plot.main()
+ def test_plot_coriolis(self):
+ with gallerytest_util.show_replaced_by_check_graphic(self):
+ plot_coriolis.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_cross_section.py b/docs/iris/gallery_tests/test_plot_cross_section.py
similarity index 68%
rename from docs/iris/example_tests/test_cross_section.py
rename to docs/iris/gallery_tests/test_plot_cross_section.py
index 7fe13d825f..4b92f5f5fe 100644
--- a/docs/iris/example_tests/test_cross_section.py
+++ b/docs/iris/gallery_tests/test_plot_cross_section.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestCrossSection(tests.GraphicsTest):
- """Test the cross_section example code."""
+ """Test the cross_section gallery code."""
- def test_cross_section(self):
+ def test_plot_cross_section(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import cross_section
+ with add_gallery_to_path():
+ import plot_cross_section
with show_replaced_by_check_graphic(self):
- cross_section.main()
+ plot_cross_section.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_custom_aggregation.py b/docs/iris/gallery_tests/test_plot_custom_aggregation.py
similarity index 67%
rename from docs/iris/example_tests/test_custom_aggregation.py
rename to docs/iris/gallery_tests/test_plot_custom_aggregation.py
index 130f46d847..b674f401b4 100644
--- a/docs/iris/example_tests/test_custom_aggregation.py
+++ b/docs/iris/gallery_tests/test_plot_custom_aggregation.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestCustomAggregation(tests.GraphicsTest):
- """Test the custom aggregation example code."""
+ """Test the custom aggregation gallery code."""
- def test_custom_aggregation(self):
+ def test_plot_custom_aggregation(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import custom_aggregation
+ with add_gallery_to_path():
+ import plot_custom_aggregation
with show_replaced_by_check_graphic(self):
- custom_aggregation.main()
+ plot_custom_aggregation.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_custom_file_loading.py b/docs/iris/gallery_tests/test_plot_custom_file_loading.py
similarity index 67%
rename from docs/iris/example_tests/test_custom_file_loading.py
rename to docs/iris/gallery_tests/test_plot_custom_file_loading.py
index 9c466c53d6..d580ac9d01 100644
--- a/docs/iris/example_tests/test_custom_file_loading.py
+++ b/docs/iris/gallery_tests/test_plot_custom_file_loading.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestCustomFileLoading(tests.GraphicsTest):
- """Test the custom_file_loading example code."""
+ """Test the custom_file_loading gallery code."""
- def test_custom_file_loading(self):
+ def test_plot_custom_file_loading(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import custom_file_loading
+ with add_gallery_to_path():
+ import plot_custom_file_loading
with show_replaced_by_check_graphic(self):
- custom_file_loading.main()
+ plot_custom_file_loading.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_deriving_phenomena.py b/docs/iris/gallery_tests/test_plot_deriving_phenomena.py
similarity index 67%
rename from docs/iris/example_tests/test_deriving_phenomena.py
rename to docs/iris/gallery_tests/test_plot_deriving_phenomena.py
index 63cbf40ec0..b7378da9df 100644
--- a/docs/iris/example_tests/test_deriving_phenomena.py
+++ b/docs/iris/gallery_tests/test_plot_deriving_phenomena.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestDerivingPhenomena(tests.GraphicsTest):
- """Test the deriving_phenomena example code."""
+ """Test the deriving_phenomena gallery code."""
- def test_deriving_phenomena(self):
+ def test_plot_deriving_phenomena(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import deriving_phenomena
+ with add_gallery_to_path():
+ import plot_deriving_phenomena
with show_replaced_by_check_graphic(self):
- deriving_phenomena.main()
+ plot_deriving_phenomena.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_hovmoller.py b/docs/iris/gallery_tests/test_plot_global_map.py
similarity index 69%
rename from docs/iris/example_tests/test_hovmoller.py
rename to docs/iris/gallery_tests/test_plot_global_map.py
index b492baebbc..ece1c3a361 100644
--- a/docs/iris/example_tests/test_hovmoller.py
+++ b/docs/iris/gallery_tests/test_plot_global_map.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestGlobalMap(tests.GraphicsTest):
- """Test the hovmoller example code."""
+ """Test the global_map gallery code."""
- def test_hovmoller(self):
+ def test_plot_global_map(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import hovmoller
+ with add_gallery_to_path():
+ import plot_global_map
with show_replaced_by_check_graphic(self):
- hovmoller.main()
+ plot_global_map.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_global_map.py b/docs/iris/gallery_tests/test_plot_hovmoller.py
similarity index 69%
rename from docs/iris/example_tests/test_global_map.py
rename to docs/iris/gallery_tests/test_plot_hovmoller.py
index 1ec2a47ef6..23fb741e44 100644
--- a/docs/iris/example_tests/test_global_map.py
+++ b/docs/iris/gallery_tests/test_plot_hovmoller.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestGlobalMap(tests.GraphicsTest):
- """Test the global_map example code."""
+ """Test the hovmoller gallery code."""
- def test_global_map(self):
+ def test_plot_hovmoller(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import global_map
+ with add_gallery_to_path():
+ import plot_hovmoller
with show_replaced_by_check_graphic(self):
- global_map.main()
+ plot_hovmoller.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_inset_plot.py b/docs/iris/gallery_tests/test_plot_inset.py
similarity index 70%
rename from docs/iris/example_tests/test_inset_plot.py
rename to docs/iris/gallery_tests/test_plot_inset.py
index 58ef63bcac..e77b629c44 100644
--- a/docs/iris/example_tests/test_inset_plot.py
+++ b/docs/iris/gallery_tests/test_plot_inset.py
@@ -9,22 +9,22 @@
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestInsetPlot(tests.GraphicsTest):
- """Test the inset plot example code."""
+ """Test the inset plot gallery code."""
- def test_inset_plot(self):
+ def test_plot_inset(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import inset_plot
+ with add_gallery_to_path():
+ import plot_inset
with show_replaced_by_check_graphic(self):
- inset_plot.main()
+ plot_inset.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_lagged_ensemble.py b/docs/iris/gallery_tests/test_plot_lagged_ensemble.py
similarity index 68%
rename from docs/iris/example_tests/test_lagged_ensemble.py
rename to docs/iris/gallery_tests/test_plot_lagged_ensemble.py
index ecce499dc7..386ad7353c 100644
--- a/docs/iris/example_tests/test_lagged_ensemble.py
+++ b/docs/iris/gallery_tests/test_plot_lagged_ensemble.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestLaggedEnsemble(tests.GraphicsTest):
- """Test the lagged ensemble example code."""
+ """Test the lagged ensemble gallery code."""
- def test_lagged_ensemble(self):
+ def test_plot_lagged_ensemble(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import lagged_ensemble
+ with add_gallery_to_path():
+ import plot_lagged_ensemble
with show_replaced_by_check_graphic(self):
- lagged_ensemble.main()
+ plot_lagged_ensemble.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_lineplot_with_legend.py b/docs/iris/gallery_tests/test_plot_lineplot_with_legend.py
similarity index 66%
rename from docs/iris/example_tests/test_lineplot_with_legend.py
rename to docs/iris/gallery_tests/test_plot_lineplot_with_legend.py
index ca246b178a..edb4d7d305 100644
--- a/docs/iris/example_tests/test_lineplot_with_legend.py
+++ b/docs/iris/gallery_tests/test_plot_lineplot_with_legend.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestLineplotWithLegend(tests.GraphicsTest):
- """Test the lineplot_with_legend example code."""
+ """Test the lineplot_with_legend gallery code."""
- def test_lineplot_with_legend(self):
+ def test_plot_lineplot_with_legend(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import lineplot_with_legend
+ with add_gallery_to_path():
+ import plot_lineplot_with_legend
with show_replaced_by_check_graphic(self):
- lineplot_with_legend.main()
+ plot_lineplot_with_legend.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_load_nemo.py b/docs/iris/gallery_tests/test_plot_load_nemo.py
similarity index 69%
rename from docs/iris/example_tests/test_load_nemo.py
rename to docs/iris/gallery_tests/test_plot_load_nemo.py
index 3d9b5bba23..58a5bbf72a 100644
--- a/docs/iris/example_tests/test_load_nemo.py
+++ b/docs/iris/gallery_tests/test_plot_load_nemo.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestLoadNemo(tests.GraphicsTest):
- """Test the load_nemo example code."""
+ """Test the load_nemo gallery code."""
- def test_load_nemo(self):
+ def test_plot_load_nemo(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import load_nemo
+ with add_gallery_to_path():
+ import plot_load_nemo
with show_replaced_by_check_graphic(self):
- load_nemo.main()
+ plot_load_nemo.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_orca_projection.py b/docs/iris/gallery_tests/test_plot_orca_projection.py
similarity index 68%
rename from docs/iris/example_tests/test_orca_projection.py
rename to docs/iris/gallery_tests/test_plot_orca_projection.py
index 1854f68aa6..2b6fae4b1b 100644
--- a/docs/iris/example_tests/test_orca_projection.py
+++ b/docs/iris/gallery_tests/test_plot_orca_projection.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestOrcaProjection(tests.GraphicsTest):
- """Test the orca projection example code."""
+ """Test the orca projection gallery code."""
- def test_orca_projection(self):
+ def test_plot_orca_projection(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import orca_projection
+ with add_gallery_to_path():
+ import plot_orca_projection
with show_replaced_by_check_graphic(self):
- orca_projection.main()
+ plot_orca_projection.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_polar_stereo.py b/docs/iris/gallery_tests/test_plot_polar_stereo.py
similarity index 69%
rename from docs/iris/example_tests/test_polar_stereo.py
rename to docs/iris/gallery_tests/test_plot_polar_stereo.py
index 963d5729fe..3cd7dfa482 100644
--- a/docs/iris/example_tests/test_polar_stereo.py
+++ b/docs/iris/gallery_tests/test_plot_polar_stereo.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestPolarStereo(tests.GraphicsTest):
- """Test the polar_stereo example code."""
+ """Test the polar_stereo gallery code."""
- def test_polar_stereo(self):
+ def test_plot_polar_stereo(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import polar_stereo
+ with add_gallery_to_path():
+ import plot_polar_stereo
with show_replaced_by_check_graphic(self):
- polar_stereo.main()
+ plot_polar_stereo.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_polynomial_fit.py b/docs/iris/gallery_tests/test_plot_polynomial_fit.py
similarity index 68%
rename from docs/iris/example_tests/test_polynomial_fit.py
rename to docs/iris/gallery_tests/test_plot_polynomial_fit.py
index 6e1b148e19..5b47b46688 100644
--- a/docs/iris/example_tests/test_polynomial_fit.py
+++ b/docs/iris/gallery_tests/test_plot_polynomial_fit.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestPolynomialFit(tests.GraphicsTest):
- """Test the polynomial_fit example code."""
+ """Test the polynomial_fit gallery code."""
- def test_polynomial_fit(self):
+ def test_plot_polynomial_fit(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import polynomial_fit
+ with add_gallery_to_path():
+ import plot_polynomial_fit
with show_replaced_by_check_graphic(self):
- polynomial_fit.main()
+ plot_polynomial_fit.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_projections_and_annotations.py b/docs/iris/gallery_tests/test_plot_projections_and_annotations.py
similarity index 65%
rename from docs/iris/example_tests/test_projections_and_annotations.py
rename to docs/iris/gallery_tests/test_plot_projections_and_annotations.py
index f273e040e4..7052414011 100644
--- a/docs/iris/example_tests/test_projections_and_annotations.py
+++ b/docs/iris/gallery_tests/test_plot_projections_and_annotations.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestProjectionsAndAnnotations(tests.GraphicsTest):
- """Test the atlantic_profiles example code."""
+ """Test the atlantic_profiles gallery code."""
- def test_projections_and_annotations(self):
+ def test_plot_projections_and_annotations(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import projections_and_annotations
+ with add_gallery_to_path():
+ import plot_projections_and_annotations
with show_replaced_by_check_graphic(self):
- projections_and_annotations.main()
+ plot_projections_and_annotations.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_rotated_pole_mapping.py b/docs/iris/gallery_tests/test_plot_rotated_pole_mapping.py
similarity index 66%
rename from docs/iris/example_tests/test_rotated_pole_mapping.py
rename to docs/iris/gallery_tests/test_plot_rotated_pole_mapping.py
index 4395b0519a..fa11a60a9c 100644
--- a/docs/iris/example_tests/test_rotated_pole_mapping.py
+++ b/docs/iris/gallery_tests/test_plot_rotated_pole_mapping.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestRotatedPoleMapping(tests.GraphicsTest):
- """Test the rotated_pole_mapping example code."""
+ """Test the rotated_pole_mapping gallery code."""
- def test_rotated_pole_mapping(self):
+ def test_plot_rotated_pole_mapping(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import rotated_pole_mapping
+ with add_gallery_to_path():
+ import plot_rotated_pole_mapping
with show_replaced_by_check_graphic(self):
- rotated_pole_mapping.main()
+ plot_rotated_pole_mapping.main()
if __name__ == "__main__":
diff --git a/docs/iris/example_tests/test_wind_speed.py b/docs/iris/gallery_tests/test_plot_wind_speed.py
similarity index 69%
rename from docs/iris/example_tests/test_wind_speed.py
rename to docs/iris/gallery_tests/test_plot_wind_speed.py
index 1cd4402fdb..7a0be601a5 100644
--- a/docs/iris/example_tests/test_wind_speed.py
+++ b/docs/iris/gallery_tests/test_plot_wind_speed.py
@@ -8,22 +8,22 @@
# importing anything else.
import iris.tests as tests
-from .extest_util import (
- add_examples_to_path,
+from .gallerytest_util import (
+ add_gallery_to_path,
show_replaced_by_check_graphic,
fail_any_deprecation_warnings,
)
class TestWindSpeed(tests.GraphicsTest):
- """Test the wind_speed example code."""
+ """Test the wind_speed gallery code."""
- def test_wind_speed(self):
+ def test_plot_wind_speed(self):
with fail_any_deprecation_warnings():
- with add_examples_to_path():
- import wind_speed
+ with add_gallery_to_path():
+ import plot_wind_speed
with show_replaced_by_check_graphic(self):
- wind_speed.main()
+ plot_wind_speed.main()
if __name__ == "__main__":
diff --git a/docs/iris/src/Makefile b/docs/iris/src/Makefile
index 53d224874d..5589cce730 100644
--- a/docs/iris/src/Makefile
+++ b/docs/iris/src/Makefile
@@ -2,18 +2,18 @@
#
# You can set these variables from the command line.
-SPHINXOPTS =
+SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
-BUILDDIR = ../build
-SRCDIR = ./
+BUILDDIR = _build
+SRCDIR = .
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
+.PHONY: help clean html html-noplot dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest
help:
@echo "Please use \`make ' where is one of"
@@ -35,34 +35,38 @@ help:
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
- -rm -rf $(BUILDDIR)/*
- -rm -rf $(SRCDIR)/iris
- -rm -rf $(SRCDIR)/examples $(SRCDIR)/_templates/gallery.html $(SRCDIR)/_static/random_image.js $(SRCDIR)/_static/random.js
+ -rm -rf $(BUILDDIR)
+ -rm -rf $(SRCDIR)/generated
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/html"
+
+html-noplot:
+ $(SPHINXBUILD) -D plot_gallery=0 -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+ @echo
+ @echo "Build finished. The HTML (no gallery) pages are in $(BUILDDIR)/html"
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml"
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
- @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+ @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml"
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
- @echo "Build finished; now you can process the pickle files."
+ @echo "Build finished; now you can process the pickle files"
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
- @echo "Build finished; now you can process the JSON files."
+ @echo "Build finished; now you can process the JSON files"
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@@ -91,7 +95,7 @@ devhelp:
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
- @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
+ @echo "Build finished. The epub file is in $(BUILDDIR)/epub"
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@@ -104,7 +108,7 @@ latexpdf: latex
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
make -C $(BUILDDIR)/latex all-pdf
- @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex"
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@@ -114,7 +118,7 @@ text:
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
- @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
+ @echo "Build finished. The manual pages are in $(BUILDDIR)/man"
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
diff --git a/docs/iris/src/_static/copybutton.js b/docs/iris/src/_static/copybutton.js
deleted file mode 100644
index 6800c3cb93..0000000000
--- a/docs/iris/src/_static/copybutton.js
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2013 PSF. Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
-// File originates from the cpython source found in Doc/tools/sphinxext/static/copybutton.js
-
-$(document).ready(function() {
- /* Add a [>>>] button on the top-right corner of code samples to hide
- * the >>> and ... prompts and the output and thus make the code
- * copyable. */
- var div = $('.highlight-python .highlight,' +
- '.highlight-python3 .highlight')
- var pre = div.find('pre');
-
- // get the styles from the current theme
- pre.parent().parent().css('position', 'relative');
- var hide_text = 'Hide the prompts and output';
- var show_text = 'Show the prompts and output';
- var border_width = pre.css('border-top-width');
- var border_style = pre.css('border-top-style');
- var border_color = pre.css('border-top-color');
- var button_styles = {
- 'cursor':'pointer', 'position': 'absolute', 'top': '0', 'right': '0',
- 'border-color': border_color, 'border-style': border_style,
- 'border-width': border_width, 'color': border_color, 'text-size': '75%',
- 'font-family': 'monospace', 'padding-left': '0.2em', 'padding-right': '0.2em'
- }
-
- // create and add the button to all the code blocks that contain >>>
- div.each(function(index) {
- var jthis = $(this);
- if (jthis.find('.gp').length > 0) {
- var button = $('>>>');
- button.css(button_styles)
- button.attr('title', hide_text);
- jthis.prepend(button);
- }
- // tracebacks (.gt) contain bare text elements that need to be
- // wrapped in a span to work with .nextUntil() (see later)
- jthis.find('pre:has(.gt)').contents().filter(function() {
- return ((this.nodeType == 3) && (this.data.trim().length > 0));
- }).wrap('');
- });
-
- // define the behavior of the button when it's clicked
- $('.copybutton').toggle(
- function() {
- var button = $(this);
- button.parent().find('.go, .gp, .gt').hide();
- button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'hidden');
- button.css('text-decoration', 'line-through');
- button.attr('title', show_text);
- },
- function() {
- var button = $(this);
- button.parent().find('.go, .gp, .gt').show();
- button.next('pre').find('.gt').nextUntil('.gp, .go').css('visibility', 'visible');
- button.css('text-decoration', 'none');
- button.attr('title', hide_text);
- });
-});
-
diff --git a/docs/iris/src/_static/favicon-16x16.png b/docs/iris/src/_static/favicon-16x16.png
deleted file mode 100644
index e2ea4567703398229924f8b8fcf9a05ab06aec07..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1041
zcmV+s1n&EZP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9
za%BK;VQFr3E^cLXAT%y9E-_;&oJ#-z1A<9JK~y+TeUe*DlLr`vd$$`_T{}i?`CCv@
zka1|ChyMpFJ#Z)|DWkR=iqr-O>1rhv$(S43P>T)_D1sCOD%Os(C;~$^*#Vd_qN1{l
zC59|)S+*r!Y{}vd_>Of=mc?vO@?L%4^Im-UX#d5lq@j^X8aA0!$rnt@;9@3~LnwR0Le=H|uoPurQpLYB$l|)d+KaGNrA#KJcM+M!pM(~RC(Kd@!g>N>
z)pd}aGDFv(12@YEMsnecC5-+0y*nxG=AHr*9HS~!c}lzmoff!mYQU;(g|V*^-o<_B
znBE8Bq0;YzQw|0NR2pqZO5RR7so5a1OJN^LL(6OqiZ0f8q~}@?d8QZPr~9G4a2oCN
z+K-&q^LrY`(yzr77CqTPX+Ecu+6Wq*%6;z@nFfW8T1>5oF?}x;j#;xOtZC#oPRk8!
zXG__8!BuZdI5Ev4h+SSF(MdIXW#>ohv4zRfQ(AhWp&k@gm_9X@c{
zJ^R&jLlu&;GPqKeSY&JpRv|{GI93MW)!t{ee9GP^0(=^%3c8*}zDGyk0orle*`=hEg
z?_9J(Rq2=if}23r3p3=1wjPDCrwp_AWtdw{h4FITV|M+;Mb-)T_CvKJw0{#N6jJ=y
z`1hmYg%(kgC{jQsj>U-+zuhYkJmbg2ZSZ3R15vRFiGlTPXtX~8#gCdSFh-3p00000
LNkvXXu0mjf*6rHh
diff --git a/docs/iris/src/_static/favicon-32x32.png b/docs/iris/src/_static/favicon-32x32.png
deleted file mode 100644
index 2f90c60eb594ee979ed7b0f6647dd19413ac5393..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2954
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
A+5i9m
diff --git a/docs/iris/src/_static/favicon.ico b/docs/iris/src/_static/favicon.ico
new file mode 100644
index 0000000000000000000000000000000000000000..0e5f0492b47539c4026dd2f78087d010c777b642
GIT binary patch
literal 1150
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