diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 6a572817a6d..97dff666cfc 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -13,7 +13,7 @@ minimum_pre_commit_version: 1.21.0
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.0.1
+ rev: v4.1.0
hooks:
# Prevent giant files from being committed.
- id: check-added-large-files
diff --git a/.readthedocs.yml b/.readthedocs.yml
index b54b0f065b3..63c4798050c 100644
--- a/.readthedocs.yml
+++ b/.readthedocs.yml
@@ -1,20 +1,20 @@
version: 2
build:
- image: latest
+ os: ubuntu-20.04
+ tools:
+ python: mambaforge-4.10
conda:
- environment: requirements/ci/readthedocs.yml
+ environment: requirements/ci/readthedocs.yml
sphinx:
- configuration: docs/src/conf.py
- fail_on_warning: false
+ configuration: docs/src/conf.py
+ fail_on_warning: false
python:
- install:
- - method: setuptools
- path: .
-
-formats:
- - htmlzip
- - pdf
+ install:
+ - method: pip
+ path: .
+ extra_requirements:
+ - docs
diff --git a/docs/gallery_code/README.rst b/docs/gallery_code/README.rst
index 02263dc5e54..720fd1e6f6f 100644
--- a/docs/gallery_code/README.rst
+++ b/docs/gallery_code/README.rst
@@ -23,4 +23,4 @@ you may start the jupyter notebook via::
If you wish to contribute to the gallery see the
:ref:`contributing.documentation.gallery` section of the
-:ref:`contributing.documentation`.
+:ref:`contributing.documentation_full`.
diff --git a/docs/src/_templates/imagehash.html b/docs/src/_templates/imagehash.html
new file mode 100644
index 00000000000..8b0dac0cce3
--- /dev/null
+++ b/docs/src/_templates/imagehash.html
@@ -0,0 +1,15 @@
+{% extends "!layout.html" %}
+
+{% block body %}
+
+
Test: {{ test }}
+
+
+{% for hash, file in hashfiles %}
+
+
{{hash}}
+

+
+{% endfor %}
+
+{% endblock %}
\ No newline at end of file
diff --git a/docs/src/conf.py b/docs/src/conf.py
index 92430b53c6e..287794368a1 100644
--- a/docs/src/conf.py
+++ b/docs/src/conf.py
@@ -158,6 +158,7 @@ def _dotv(version):
"sphinx_gallery.gen_gallery",
"matplotlib.sphinxext.mathmpl",
"matplotlib.sphinxext.plot_directive",
+ "image_test_output",
]
if skip_api == "1":
diff --git a/docs/src/developers_guide/contributing_documentation.rst b/docs/src/developers_guide/contributing_documentation.rst
index efd31d4f20e..e289b1548d0 100644
--- a/docs/src/developers_guide/contributing_documentation.rst
+++ b/docs/src/developers_guide/contributing_documentation.rst
@@ -1,173 +1,21 @@
-.. _contributing.documentation:
-
-Contributing to the Documentation
----------------------------------
+How to Contribute to the Documentation
+--------------------------------------
Documentation is important and we encourage any improvements that can be made.
If you believe the documentation is not clear please contribute a change to
improve the documentation for all users.
-Any change to the Iris project whether it is a bugfix, new feature or
-documentation update must use the :ref:`development-workflow`.
-
-
-Requirements
-~~~~~~~~~~~~
-
-The documentation uses specific packages that need to be present. Please see
-:ref:`installing_iris` for instructions.
-
-
-.. _contributing.documentation.building:
-
-Building
-~~~~~~~~
-
-This documentation was built using the latest Python version that Iris
-supports. For more information see :ref:`installing_iris`.
-
-The build can be run from the documentation directory ``docs/src``.
-
-The build output for the html is found in the ``_build/html`` sub directory.
-When updating the documentation ensure the html build has *no errors* or
-*warnings* otherwise it may fail the automated `cirrus-ci`_ build.
-
-Once the build is complete, if it is rerun it will only rebuild the impacted
-build artefacts so should take less time.
-
-There is an option to perform a build but skip the
-:ref:`contributing.documentation.gallery` creation completely. This can be
-achieved via::
-
- make html-noplot
-
-Another option is to skip the :ref:`iris` documentation creation. This can be
-useful as it reduces the time to build the documentation, however you may have
-some build warnings as there maybe references to the API documentation.
-This can be achieved via::
-
- make html-noapi
-
-You can combine both the above and skip the
-:ref:`contributing.documentation.gallery` and :ref:`iris` documentation
-completely. This can be achieved via::
-
- make html-quick
-
-If you wish to run a full clean build you can run::
-
- make clean
- make html
-
-This is useful for a final test before committing your changes.
-
-.. note:: In order to preserve a clean build for the html, all **warnings**
- have been promoted to be **errors** to ensure they are addressed.
- This **only** applies when ``make html`` is run.
-
-.. _cirrus-ci: https://cirrus-ci.com/github/SciTools/iris
-
-.. _contributing.documentation.testing:
-
-Testing
-~~~~~~~
-
-There are a ways to test various aspects of the documentation. The
-``make`` commands shown below can be run in the ``docs`` or
-``docs/src`` directory.
-
-Each :ref:`contributing.documentation.gallery` entry has a corresponding test.
-To run the tests::
-
- make gallerytest
-
-Many documentation pages includes python code itself that can be run to ensure
-it is still valid or to demonstrate examples. To ensure these tests pass
-run::
-
- make doctest
-
-See :data:`iris.cube.Cube.data` for an example of using the `doctest`_
-approach.
-
-.. _doctest: http://www.sphinx-doc.org/en/stable/ext/doctest.html
-
-The hyperlinks in the documentation can be checked automatically.
-If there is a link that is known to work it can be excluded from the checks by
-adding it to the ``linkcheck_ignore`` array that is defined in the
-`conf.py`_. The hyperlink check can be run via::
-
- make linkcheck
-
-If this fails check the output for the text **broken** and then correct
-or ignore the url.
-
-.. comment
- Finally, the spelling in the documentation can be checked automatically via the
- command::
-
- make spelling
-
- The spelling check may pull up many technical abbreviations and acronyms. This
- can be managed by using an **allow** list in the form of a file. This file,
- or list of files is set in the `conf.py`_ using the string list
- ``spelling_word_list_filename``.
-
-
-.. note:: In addition to the automated `cirrus-ci`_ build of all the
- documentation build options above, the
- https://readthedocs.org/ service is also used. The configuration
- of this held in a file in the root of the
- `github Iris project `_ named
- ``.readthedocs.yml``.
-
-
-.. _conf.py: https://github.com/SciTools/iris/blob/main/docs/src/conf.py
-
-
-.. _contributing.documentation.api:
-
-Generating API Documentation
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-In order to auto generate the API documentation based upon the docstrings a
-custom set of python scripts are used, these are located in the directory
-``docs/src/sphinxext``. Once the ``make html`` command has been run,
-the output of these scripts can be found in
-``docs/src/generated/api``.
-
-If there is a particularly troublesome module that breaks the ``make html`` you
-can exclude the module from the API documentation. Add the entry to the
-``exclude_modules`` tuple list in the
-``docs/src/sphinxext/generate_package_rst.py`` file.
-
-
-.. _contributing.documentation.gallery:
-
-Gallery
-~~~~~~~
-
-The Iris :ref:`sphx_glr_generated_gallery` uses a sphinx extension named
-`sphinx-gallery `_
-that auto generates reStructuredText (rst) files based upon a gallery source
-directory that abides directory and filename convention.
-
-The code for the gallery entries are in ``docs/gallery_code``.
-Each sub directory in this directory is a sub section of the gallery. The
-respective ``README.rst`` in each folder is included in the gallery output.
-
-For each gallery entry there must be a corresponding test script located in
-``docs/gallery_tests``.
+If you're confident diving right in, please head for
+:ref:`contributing.documentation_full`.
-To add an entry to the gallery simple place your python code into the
-appropriate sub directory and name it with a prefix of ``plot_``. If your
-gallery entry does not fit into any existing sub directories then create a new
-directory and place it in there.
+If you're not then we've got a step-by-step guide here to walk you through it:
+:ref:`contributing.documentation_easy`
-The reStructuredText (rst) output of the gallery is located in
-``docs/src/generated/gallery``.
+.. toctree::
+ :maxdepth: 1
+ :hidden:
-For more information on the directory structure and options please see the
-`sphinx-gallery getting started
-`_ documentation.
+ contributing_documentation_easy
+ contributing_documentation_full
+
\ No newline at end of file
diff --git a/docs/src/developers_guide/contributing_documentation_easy.rst b/docs/src/developers_guide/contributing_documentation_easy.rst
new file mode 100755
index 00000000000..f54de628bfd
--- /dev/null
+++ b/docs/src/developers_guide/contributing_documentation_easy.rst
@@ -0,0 +1,102 @@
+
+.. _contributing.documentation_easy:
+
+Contributing to the Documentation (the easy way)
+------------------------------------------------
+
+Documentation is important and we encourage any improvements that can be made.
+If you believe the documentation is not clear please contribute a change to
+improve the documentation for all users.
+
+The guide below is designed to be accessible to those with little-to-no
+knowledge of programming and GitHub. If you find that something doesn't work as
+described or could use more explanation then please let us know (or contribute
+the improvement yourself)!
+
+First Time Only Steps
+^^^^^^^^^^^^^^^^^^^^^
+
+1. Create a `GitHub `_ account.
+
+2. Complete the Scitools Contributor License Agreement (`link to Google Form
+ `_).
+ This is a one-off requirement for anyone who wishes to contribute to a
+ Scitools repository - including the documentation.
+
+Steps to Complete Each Time You Propose Changes
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+1. Navigate to the documentation page that you want to edit (on this site).
+
+2. Click the ``Edit on GitHub`` button at the **top right** of the page.
+
+.. image:: edit_on_github.png
+
+3. In the resulting GitHub page select **main** from the ``Switch
+ branches/tags`` drop-down menu near the **top left** of the page (to the left
+ of the ``iris / docs / src / ...`` links) if it isn't already. This changes
+ the branch to **main**.
+
+.. image:: find_main.png
+
+4. Click the pencil symbol near the **top right** (to the right of the ``Raw``
+ and ``Blame`` buttons).
+
+.. image:: edit_button.png
+
+5. Make your edits! Try to strike a balance between informing the audience
+ enough that they understand and overwhelming them with information.
+
+.. note::
+
+ You may see the following message at the top of the edit page, informing you
+ that GitHub has created you your own ``fork`` (or copy) of the project as a
+ precursor to allowing you to edit the page. Your changes will be merged into
+ the main version of the documentation later.
+
+ .. image:: fork_banner.png
+
+6. Scroll to the bottom of the edit page and enter some appropriate information
+ in the two boxes under ``Propose changes``. You can just keep the default text
+ if you like or enter something more specific - a short sentence explaining
+ what's changed is fine. Then click the ``Propose changes`` button.
+
+.. image:: propose_changes.png
+
+7. In the resulting page titled ``Pull Request``, write a brief description of
+ what you've changed underneath the following three lines:
+
+.. code::
+
+ ### Description
+
+
+
+Describing what you've changed and why will help the person who reviews your changes.
+
+.. image:: pull_request.png
+
+8. Click the ``Create pull request`` button.
+
+.. tip::
+
+ If you're not sure that you're making your pull request right, or have a
+ question, then make it anyway! You can then comment on it tagging
+ ``@SciTools/iris-devs`` to ask your question (then edit your pull request if
+ you need to).
+
+What Happens Next?
+^^^^^^^^^^^^^^^^^^
+
+Another Iris contributor will review your changes (this happens for everyone who
+makes changes to Iris or its documentation). The reviewer might make comments or
+ask questions (don't worry about missing these, GitHub will email you to let you
+know). You can respond to these comments underneath where they appear in GitHub.
+
+Once you've worked everything out together, the reviewer will merge your changes
+into the main version of the documentation so that they're accessible for
+everyone to benefit from.
+
+**You've now contributed to the Iris documentation!** If you've caught the bug
+and want to get more involved (or you're just interested what that would mean)
+then chat to the person reviewing your code or another Iris contributor.
\ No newline at end of file
diff --git a/docs/src/developers_guide/contributing_documentation_full.rst b/docs/src/developers_guide/contributing_documentation_full.rst
new file mode 100755
index 00000000000..77b898c0f30
--- /dev/null
+++ b/docs/src/developers_guide/contributing_documentation_full.rst
@@ -0,0 +1,173 @@
+
+.. _contributing.documentation_full:
+
+Contributing to the Documentation
+---------------------------------
+
+This guide is for those comfortable with the development process, looking for
+the specifics of how to apply that knowledge to Iris. You may instead find it
+easier to use the :ref:`contributing.documentation_easy`.
+
+Any change to the Iris project whether it is a bugfix, new feature or
+documentation update must use the :ref:`development-workflow`.
+
+
+Requirements
+~~~~~~~~~~~~
+
+The documentation uses specific packages that need to be present. Please see
+:ref:`installing_iris` for instructions.
+
+
+.. _contributing.documentation.building:
+
+Building
+~~~~~~~~
+
+This documentation was built using the latest Python version that Iris
+supports. For more information see :ref:`installing_iris`.
+
+The build can be run from the documentation directory ``docs/src``.
+
+The build output for the html is found in the ``_build/html`` sub directory.
+When updating the documentation ensure the html build has *no errors* or
+*warnings* otherwise it may fail the automated `cirrus-ci`_ build.
+
+Once the build is complete, if it is rerun it will only rebuild the impacted
+build artefacts so should take less time.
+
+There is an option to perform a build but skip the
+:ref:`contributing.documentation.gallery` creation completely. This can be
+achieved via::
+
+ make html-noplot
+
+Another option is to skip the :ref:`iris` documentation creation. This can be
+useful as it reduces the time to build the documentation, however you may have
+some build warnings as there maybe references to the API documentation.
+This can be achieved via::
+
+ make html-noapi
+
+You can combine both the above and skip the
+:ref:`contributing.documentation.gallery` and :ref:`iris` documentation
+completely. This can be achieved via::
+
+ make html-quick
+
+If you wish to run a full clean build you can run::
+
+ make clean
+ make html
+
+This is useful for a final test before committing your changes.
+
+.. note:: In order to preserve a clean build for the html, all **warnings**
+ have been promoted to be **errors** to ensure they are addressed.
+ This **only** applies when ``make html`` is run.
+
+.. _cirrus-ci: https://cirrus-ci.com/github/SciTools/iris
+
+.. _contributing.documentation.testing:
+
+Testing
+~~~~~~~
+
+There are a ways to test various aspects of the documentation. The
+``make`` commands shown below can be run in the ``docs`` or
+``docs/src`` directory.
+
+Each :ref:`contributing.documentation.gallery` entry has a corresponding test.
+To run the tests::
+
+ make gallerytest
+
+Many documentation pages includes python code itself that can be run to ensure
+it is still valid or to demonstrate examples. To ensure these tests pass
+run::
+
+ make doctest
+
+See :data:`iris.cube.Cube.data` for an example of using the `doctest`_
+approach.
+
+.. _doctest: http://www.sphinx-doc.org/en/stable/ext/doctest.html
+
+The hyperlinks in the documentation can be checked automatically.
+If there is a link that is known to work it can be excluded from the checks by
+adding it to the ``linkcheck_ignore`` array that is defined in the
+`conf.py`_. The hyperlink check can be run via::
+
+ make linkcheck
+
+If this fails check the output for the text **broken** and then correct
+or ignore the url.
+
+.. comment
+ Finally, the spelling in the documentation can be checked automatically via the
+ command::
+
+ make spelling
+
+ The spelling check may pull up many technical abbreviations and acronyms. This
+ can be managed by using an **allow** list in the form of a file. This file,
+ or list of files is set in the `conf.py`_ using the string list
+ ``spelling_word_list_filename``.
+
+
+.. note:: In addition to the automated `cirrus-ci`_ build of all the
+ documentation build options above, the
+ https://readthedocs.org/ service is also used. The configuration
+ of this held in a file in the root of the
+ `github Iris project `_ named
+ ``.readthedocs.yml``.
+
+
+.. _conf.py: https://github.com/SciTools/iris/blob/main/docs/src/conf.py
+
+
+.. _contributing.documentation.api:
+
+Generating API Documentation
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In order to auto generate the API documentation based upon the docstrings a
+custom set of python scripts are used, these are located in the directory
+``docs/src/sphinxext``. Once the ``make html`` command has been run,
+the output of these scripts can be found in
+``docs/src/generated/api``.
+
+If there is a particularly troublesome module that breaks the ``make html`` you
+can exclude the module from the API documentation. Add the entry to the
+``exclude_modules`` tuple list in the
+``docs/src/sphinxext/generate_package_rst.py`` file.
+
+
+.. _contributing.documentation.gallery:
+
+Gallery
+~~~~~~~
+
+The Iris :ref:`sphx_glr_generated_gallery` uses a sphinx extension named
+`sphinx-gallery `_
+that auto generates reStructuredText (rst) files based upon a gallery source
+directory that abides directory and filename convention.
+
+The code for the gallery entries are in ``docs/gallery_code``.
+Each sub directory in this directory is a sub section of the gallery. The
+respective ``README.rst`` in each folder is included in the gallery output.
+
+For each gallery entry there must be a corresponding test script located in
+``docs/gallery_tests``.
+
+To add an entry to the gallery simple place your python code into the
+appropriate sub directory and name it with a prefix of ``plot_``. If your
+gallery entry does not fit into any existing sub directories then create a new
+directory and place it in there.
+
+The reStructuredText (rst) output of the gallery is located in
+``docs/src/generated/gallery``.
+
+For more information on the directory structure and options please see the
+`sphinx-gallery getting started
+`_ documentation.
diff --git a/docs/src/developers_guide/contributing_graphics_tests.rst b/docs/src/developers_guide/contributing_graphics_tests.rst
index 53e895f4402..1268aa2686d 100644
--- a/docs/src/developers_guide/contributing_graphics_tests.rst
+++ b/docs/src/developers_guide/contributing_graphics_tests.rst
@@ -63,6 +63,8 @@ This consists of:
developer to easily compare proposed new **acceptable** result images
against the existing accepted reference images, for each failing test.
+The acceptable images for each test can be viewed online. The :ref:`testing.imagehash_index` lists all the graphical tests in the test suite and
+shows the known acceptable result images for comparison.
Reviewing Failing Tests
=======================
diff --git a/docs/src/developers_guide/contributing_testing_index.rst b/docs/src/developers_guide/contributing_testing_index.rst
index 517111507b5..c5cf1b997b8 100644
--- a/docs/src/developers_guide/contributing_testing_index.rst
+++ b/docs/src/developers_guide/contributing_testing_index.rst
@@ -8,5 +8,6 @@ Testing
contributing_testing
contributing_graphics_tests
+ imagehash_index
contributing_running_tests
contributing_ci_tests
diff --git a/docs/src/developers_guide/edit_button.png b/docs/src/developers_guide/edit_button.png
new file mode 100755
index 00000000000..ee2e7858f05
Binary files /dev/null and b/docs/src/developers_guide/edit_button.png differ
diff --git a/docs/src/developers_guide/edit_on_github.png b/docs/src/developers_guide/edit_on_github.png
new file mode 100755
index 00000000000..f802ebd9d63
Binary files /dev/null and b/docs/src/developers_guide/edit_on_github.png differ
diff --git a/docs/src/developers_guide/find_main.png b/docs/src/developers_guide/find_main.png
new file mode 100755
index 00000000000..8a7af306cda
Binary files /dev/null and b/docs/src/developers_guide/find_main.png differ
diff --git a/docs/src/developers_guide/fork_banner.png b/docs/src/developers_guide/fork_banner.png
new file mode 100755
index 00000000000..0d140c9fc6d
Binary files /dev/null and b/docs/src/developers_guide/fork_banner.png differ
diff --git a/docs/src/developers_guide/imagehash_index.rst b/docs/src/developers_guide/imagehash_index.rst
new file mode 100644
index 00000000000..a11ae8a5316
--- /dev/null
+++ b/docs/src/developers_guide/imagehash_index.rst
@@ -0,0 +1,20 @@
+.. include:: ../common_links.inc
+
+.. _testing.imagehash_index:
+
+Graphical Test Hash Index
+*************************
+
+The iris test suite produces plots of data using matplotlib and cartopy.
+The images produced are compared to known "good" output, the images for
+which are kept in `scitools/test-iris-imagehash `_.
+
+For an overview of iris' graphics tests, see :ref:`testing.graphics`
+
+Typically running the iris test suite will output the rendered
+images to ``$PROJECT_DIR/iris_image_test_output``.
+The known good output for each test can be seen at the links below
+for comparison.
+
+
+.. imagetest-list::
\ No newline at end of file
diff --git a/docs/src/developers_guide/propose_changes.png b/docs/src/developers_guide/propose_changes.png
new file mode 100755
index 00000000000..d4e367ce1db
Binary files /dev/null and b/docs/src/developers_guide/propose_changes.png differ
diff --git a/docs/src/developers_guide/pull_request.png b/docs/src/developers_guide/pull_request.png
new file mode 100755
index 00000000000..bdc0698f54e
Binary files /dev/null and b/docs/src/developers_guide/pull_request.png differ
diff --git a/docs/src/index.rst b/docs/src/index.rst
index d5802922014..7518f948d88 100644
--- a/docs/src/index.rst
+++ b/docs/src/index.rst
@@ -134,7 +134,7 @@ For **Iris 2.4** and earlier documentation please see the
.. toctree::
- :maxdepth: 1
+ :maxdepth: 2
:caption: Developers Guide
:name: development_index
:hidden:
diff --git a/docs/src/sphinxext/image_test_output.py b/docs/src/sphinxext/image_test_output.py
new file mode 100644
index 00000000000..9e492a5be9a
--- /dev/null
+++ b/docs/src/sphinxext/image_test_output.py
@@ -0,0 +1,78 @@
+# Copyright Iris contributors
+#
+# This file is part of Iris and is released under the LGPL license.
+# See COPYING and COPYING.LESSER in the root of the repository for full
+# licensing details.
+
+import json
+import re
+from typing import Dict, List
+
+from docutils import nodes
+from sphinx.application import Sphinx
+from sphinx.util.docutils import SphinxDirective
+
+ImageRepo = Dict[str, List[str]]
+
+HASH_MATCH = re.compile(r"([^\/]+)\.png$")
+
+
+def hash_from_url(url: str) -> str:
+ match = HASH_MATCH.search(url)
+ if not match:
+ raise ValueError(f"url {url} does not match form `http...hash.png`")
+ else:
+ return match.groups()[0]
+
+
+class ImageTestDirective(SphinxDirective):
+ def run(self):
+ with open(self.config["image_test_json"], "r") as fh:
+ imagerepo = json.load(fh)
+ enum_list = nodes.enumerated_list()
+ nodelist = []
+ nodelist.append(enum_list)
+ for test in sorted(imagerepo):
+ link_node = nodes.raw(
+ "",
+ f'{test}',
+ format="html",
+ )
+ li_node = nodes.list_item("")
+ li_node += link_node
+ enum_list += li_node
+ return nodelist
+
+
+def collect_imagehash_pages(app: Sphinx):
+ """Generate pages for each entry in the imagerepo.json"""
+ with open(app.config["image_test_json"], "r") as fh:
+ imagerepo: ImageRepo = json.load(fh)
+ pages = []
+ for test, hashfiles in imagerepo.items():
+ hashstrs = [hash_from_url(h) for h in hashfiles]
+ pages.append(
+ (
+ f"generated/image_test/{test}",
+ {"test": test, "hashfiles": zip(hashstrs, hashfiles)},
+ "imagehash.html",
+ )
+ )
+ return pages
+
+
+def setup(app: Sphinx):
+ app.add_config_value(
+ "image_test_json",
+ "../../lib/iris/tests/results/imagerepo.json",
+ "html",
+ )
+
+ app.add_directive("imagetest-list", ImageTestDirective)
+ app.connect("html-collect-pages", collect_imagehash_pages)
+
+ return {
+ "version": "0.1",
+ "parallel_read_safe": True,
+ "parallel_write_safe": True,
+ }
diff --git a/docs/src/userguide/loading_iris_cubes.rst b/docs/src/userguide/loading_iris_cubes.rst
index a66af12b9cf..ec459dbbdf3 100644
--- a/docs/src/userguide/loading_iris_cubes.rst
+++ b/docs/src/userguide/loading_iris_cubes.rst
@@ -51,15 +51,14 @@ The ``air_potential_temperature`` cubes were 4 dimensional with:
.. note::
- The result of :func:`iris.load` is **always** a
- :class:`list of cubes `.
- Anything that can be done with a Python :class:`list` can be done
- with the resultant list of cubes. It is worth noting, however, that
- there is no inherent order to this
- :class:`list of cubes `.
- Because of this, indexing may be inconsistent. A more consistent way to
- extract a cube is by using the :class:`iris.Constraint` class as
- described in :ref:`constrained-loading`.
+ The result of :func:`iris.load` is **always** a :class:`iris.cube.CubeList`
+ (even if it only contains one :class:`iris.cube.Cube` - see
+ :ref:`strict-loading`). Anything that can be done with a Python
+ :class:`list` can be done with an :class:`iris.cube.CubeList`.
+
+ The order of this list should not be relied upon. Ways of loading a
+ specific cube or cubes are covered in :ref:`constrained-loading` and
+ :ref:`strict-loading`.
.. hint::
@@ -414,6 +413,7 @@ PartialDateTime this becomes simple:
Notice how the dates printed are between the range specified in the ``st_swithuns_daterange``
and that they span multiple years.
+.. _strict-loading:
Strict Loading
--------------
diff --git a/docs/src/userguide/plotting_a_cube.rst b/docs/src/userguide/plotting_a_cube.rst
index c22ce043c9a..cfb3445d9b1 100644
--- a/docs/src/userguide/plotting_a_cube.rst
+++ b/docs/src/userguide/plotting_a_cube.rst
@@ -5,10 +5,9 @@ Plotting a Cube
===============
Iris utilises the power of Python's
-`Matplotlib `_ package in order to generate
+`Matplotlib `_ package in order to generate
high quality, production ready 1D and 2D plots.
-The functionality of the Matplotlib
-`pyplot `_ module has
+The functionality of the Matplotlib :py:mod:`~matplotlib.pyplot` module has
been extended within Iris to facilitate easy visualisation of a cube's data.
@@ -218,7 +217,7 @@ Plotting 2-Dimensional Cubes
Creating Maps
-------------
Whenever a 2D plot is created using an :class:`iris.coord_systems.CoordSystem`,
-a cartopy :class:`~cartopy.mpl.GeoAxes` instance is created, which can be
+a cartopy :class:`~cartopy.mpl.geoaxes.GeoAxes` instance is created, which can be
accessed with the :func:`matplotlib.pyplot.gca` function.
Given the current map, you can draw gridlines and coastlines amongst other
@@ -226,8 +225,8 @@ things.
.. seealso::
- :meth:`cartopy's gridlines() `,
- :meth:`cartopy's coastlines() `.
+ :meth:`cartopy's gridlines() `,
+ :meth:`cartopy's coastlines() `.
Cube Contour
diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst
index 63c96f8962a..2787e0044f4 100644
--- a/docs/src/whatsnew/latest.rst
+++ b/docs/src/whatsnew/latest.rst
@@ -124,10 +124,6 @@ This document explains the changes made to Iris for this release
#. `@rcomer`_ fixed :meth:`~iris.cube.Cube.subset` to alway return ``None`` if
no value match is found. (:pull:`4417`)
-#. `@wjbenfold`_ resolved an issue that previously caused regridding with lazy
- data to take significantly longer than with real data. Relevant benchmark
- shows a time decrease from >10s to 625ms. (:issue:`4280`, :pull:`4400`)
-
#. `@wjbenfold`_ changed :meth:`iris.util.points_step` to stop it from warning
when applied to a single point (:issue:`4250`, :pull:`4367`)
@@ -140,6 +136,10 @@ This document explains the changes made to Iris for this release
coordinate bounds using minimum and maximum for unordered coordinates,
fixing :issue:`1528`. (:pull:`4315`)
+#. `@wjbenfold`_ changed how a delayed unit conversion is performed on a cube
+ so that a cube with lazy data awaiting a unit conversion can be pickled.
+ (:issue:`4354 `, :pull:`4377`)
+
💣 Incompatible Changes
=======================
@@ -150,7 +150,10 @@ This document explains the changes made to Iris for this release
🚀 Performance Enhancements
===========================
-#. N/A
+#. `@wjbenfold`_ resolved an issue that previously caused regridding with lazy
+ data to take significantly longer than with real data. Benchmark
+ :class:`benchmarks.HorizontalChunkedRegridding` shows a time decrease
+ from >10s to 625ms. (:issue:`4280`, :pull:`4400`)
🔥 Deprecations
@@ -197,6 +200,19 @@ This document explains the changes made to Iris for this release
#. `@trexfeathers`_ encouraged contributors to include type hinting in code
they are working on - :ref:`code_formatting`. (:pull:`4390`)
+#. `@wjbenfold`_ updated Cartopy documentation links to point to the renamed
+ :class:`cartopy.mpl.geoaxes.GeoAxes`. (:pull:`4464`)
+
+#. `@wjbenfold`_ clarified behaviour of :func:`iris.load` in :ref:`userguide
+ loading section `. (:pull:`4462`)
+
+#. `@bjlittle`_ migrated readthedocs to use mambaforge for `faster documentation building`_.
+ (:pull:`4476`)
+
+#. `@wjbenfold`_ contributed `@alastair-gemmell`_'s :ref:`step-by-step guide to
+ contributing to the docs ` to the docs.
+ (:pull:`4461`)
+
💼 Internal
===========
@@ -270,3 +286,4 @@ This document explains the changes made to Iris for this release
.. _NEP-29: https://numpy.org/neps/nep-0029-deprecation_policy.html
.. _UGRID: http://ugrid-conventions.github.io/ugrid-conventions/
.. _sort-all: https://github.com/aio-libs/sort-all
+.. _faster documentation building: https://docs.readthedocs.io/en/stable/guides/conda.html#making-builds-faster-with-mamba
diff --git a/lib/iris/cube.py b/lib/iris/cube.py
index 90acc021bc1..3e1e98d12d2 100644
--- a/lib/iris/cube.py
+++ b/lib/iris/cube.py
@@ -1051,9 +1051,7 @@ def convert_units(self, unit):
old_unit = self.units
new_unit = unit
- # Define a delayed conversion operation (i.e. a callback).
- def pointwise_convert(values):
- return old_unit.convert(values, new_unit)
+ pointwise_convert = partial(old_unit.convert, other=new_unit)
new_data = _lazy.lazy_elementwise(
self.lazy_data(), pointwise_convert
diff --git a/lib/iris/fileformats/_nc_load_rules/actions.py b/lib/iris/fileformats/_nc_load_rules/actions.py
index e3b63d41d22..d286abbf3d6 100644
--- a/lib/iris/fileformats/_nc_load_rules/actions.py
+++ b/lib/iris/fileformats/_nc_load_rules/actions.py
@@ -184,16 +184,19 @@ def action_provides_coordinate(engine, dimcoord_fact):
# Identify the "type" of a coordinate variable
coord_type = None
- # NOTE: must test for rotated cases *first*, as 'is_longitude' and
- # 'is_latitude' functions also accept rotated cases.
- if hh.is_rotated_latitude(engine, var_name):
- coord_type = "rotated_latitude"
- elif hh.is_rotated_longitude(engine, var_name):
- coord_type = "rotated_longitude"
- elif hh.is_latitude(engine, var_name):
- coord_type = "latitude"
+
+ if hh.is_latitude(engine, var_name):
+ # N.B. result of 'is_rotated_lat/lon' checks are valid ONLY when the
+ # relevant 'is_lat/lon' is also True.
+ if hh.is_rotated_latitude(engine, var_name):
+ coord_type = "rotated_latitude"
+ else:
+ coord_type = "latitude"
elif hh.is_longitude(engine, var_name):
- coord_type = "longitude"
+ if hh.is_rotated_longitude(engine, var_name):
+ coord_type = "rotated_longitude"
+ else:
+ coord_type = "longitude"
elif hh.is_time(engine, var_name):
coord_type = "time"
elif hh.is_time_period(engine, var_name):
diff --git a/lib/iris/plot.py b/lib/iris/plot.py
index 1db60d0fae3..0e9645c7835 100644
--- a/lib/iris/plot.py
+++ b/lib/iris/plot.py
@@ -858,9 +858,9 @@ def _replace_axes_with_cartopy_axes(cartopy_proj):
def _ensure_cartopy_axes_and_determine_kwargs(x_coord, y_coord, kwargs):
"""
- Replace the current non-cartopy axes with :class:`cartopy.mpl.GeoAxes`
- and return the appropriate kwargs dict based on the provided coordinates
- and kwargs.
+ Replace the current non-cartopy axes with
+ :class:`cartopy.mpl.geoaxes.GeoAxes` and return the appropriate kwargs dict
+ based on the provided coordinates and kwargs.
"""
# Determine projection.
@@ -874,7 +874,7 @@ def _ensure_cartopy_axes_and_determine_kwargs(x_coord, y_coord, kwargs):
else:
cartopy_proj = ccrs.PlateCarree()
- # Ensure the current axes are a cartopy.mpl.GeoAxes instance.
+ # Ensure the current axes are a cartopy.mpl.geoaxes.GeoAxes instance.
axes = kwargs.get("axes")
if axes is None:
if (
@@ -1430,7 +1430,8 @@ def barbs(u_cube, v_cube, *args, **kwargs):
:func:`iris.analysis.cartography.rotate_grid_vectors`.
To transform coordinate grid points, you will need to create
2-dimensional arrays of x and y values. These can be transformed with
- :meth:`cartopy.crs.CRS.transform_points`.
+ the :meth:`~cartopy.crs.CRS.transform_points` method of
+ :class:`cartopy.crs.CRS`.
Kwargs:
@@ -1478,7 +1479,8 @@ def quiver(u_cube, v_cube, *args, **kwargs):
:func:`iris.analysis.cartography.rotate_grid_vectors`.
To transform coordinate grid points, you will need to create
2-dimensional arrays of x and y values. These can be transformed with
- :meth:`cartopy.crs.CRS.transform_points`.
+ the :meth:`~cartopy.crs.CRS.transform_points` method of
+ :class:`cartopy.crs.CRS`.
Kwargs:
diff --git a/lib/iris/tests/test_pickling.py b/lib/iris/tests/test_pickling.py
index e01f791d039..26247e795b8 100644
--- a/lib/iris/tests/test_pickling.py
+++ b/lib/iris/tests/test_pickling.py
@@ -16,9 +16,10 @@
import pickle
import cf_units
+import numpy as np
import iris
-from iris._lazy_data import as_concrete_data
+from iris._lazy_data import as_concrete_data, as_lazy_data
class TestPickle(tests.IrisTest):
@@ -76,6 +77,14 @@ def test_cube_with_coord_points(self):
_, recon_cube = next(self.pickle_then_unpickle(cube))
self.assertEqual(recon_cube, cube)
+ def test_cube_with_deferred_unit_conversion(self):
+ real_data = np.arange(12.0).reshape((3, 4))
+ lazy_data = as_lazy_data(real_data)
+ cube = iris.cube.Cube(lazy_data, units="m")
+ cube.convert_units("ft")
+ _, recon_cube = next(self.pickle_then_unpickle(cube))
+ self.assertEqual(recon_cube, cube)
+
@tests.skip_data
def test_cubelist_pickle(self):
cubelist = iris.load(
diff --git a/lib/iris/tests/unit/fileformats/nc_load_rules/actions/__init__.py b/lib/iris/tests/unit/fileformats/nc_load_rules/actions/__init__.py
index 717e5b5c417..0d3ed932e88 100644
--- a/lib/iris/tests/unit/fileformats/nc_load_rules/actions/__init__.py
+++ b/lib/iris/tests/unit/fileformats/nc_load_rules/actions/__init__.py
@@ -6,9 +6,6 @@
"""
Unit tests for the module :mod:`iris.fileformats._nc_load_rules.actions`.
-This module provides the engine.activate() call used in the function
-`iris.fileformats.netcdf._load_cube`.
-
"""
from pathlib import Path
import shutil
diff --git a/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__latlon_dimcoords.py b/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__latlon_dimcoords.py
new file mode 100644
index 00000000000..dfa862c4d1a
--- /dev/null
+++ b/lib/iris/tests/unit/fileformats/nc_load_rules/actions/test__latlon_dimcoords.py
@@ -0,0 +1,337 @@
+# Copyright Iris contributors
+#
+# This file is part of Iris and is released under the LGPL license.
+# See COPYING and COPYING.LESSER in the root of the repository for full
+# licensing details.
+"""
+Unit tests for the engine.activate() call within the
+`iris.fileformats.netcdf._load_cube` function.
+
+Tests for rules behaviour in identifying latitude/longitude dim-coords, both
+rotated and non-rotated.
+
+"""
+import iris.tests as tests # isort: skip
+
+from iris.coord_systems import GeogCS, RotatedGeogCS
+from iris.tests.unit.fileformats.nc_load_rules.actions import (
+ Mixin__nc_load_actions,
+)
+
+
+class Mixin_latlon_dimcoords(Mixin__nc_load_actions):
+ # Tests for the recognition and construction of latitude/longitude coords.
+
+ # Control to test either longitude or latitude coords.
+ # Set by inheritor classes, which are actual TestCases.
+ lat_1_or_lon_0 = None
+
+ def setUp(self):
+ super().setUp()
+ # Generate some useful settings : just to generalise operation over
+ # both latitude and longitude.
+ islat = self.lat_1_or_lon_0
+ assert islat in (0, 1)
+ self.unrotated_name = "latitude" if islat else "longitude"
+ self.rotated_name = "grid_latitude" if islat else "grid_longitude"
+ self.unrotated_units = "degrees_north" if islat else "degrees_east"
+ # Note: there are many alternative valid forms for the rotated units,
+ # but we are not testing that here.
+ self.rotated_units = "degrees" # NB this one is actually constant
+ self.axis = "y" if islat else "x"
+
+ def _make_testcase_cdl(
+ self,
+ standard_name=None,
+ long_name=None,
+ var_name=None,
+ units=None,
+ axis=None,
+ grid_mapping=None,
+ ):
+ # Inner routine called by 'run_testcase' (in Mixin__nc_load_actions),
+ # to generate CDL which is then translated into a testfile and loaded.
+ if var_name is None:
+ # Can't have *no* var-name
+ # N.B. it is also the name of the dimension.
+ var_name = "dim"
+
+ def attribute_str(name, value):
+ if value is None or value == "":
+ result = ""
+ else:
+ result = f'{var_name}:{name} = "{value}" ;'
+
+ return result
+
+ standard_name_str = attribute_str("standard_name", standard_name)
+ long_name_str = attribute_str("long_name", long_name)
+ units_str = attribute_str("units", units)
+ axis_str = attribute_str("axis", axis)
+ if grid_mapping:
+ grid_mapping_str = 'phenom:grid_mapping = "crs" ;'
+ else:
+ grid_mapping_str = ""
+
+ assert grid_mapping in (None, "latlon", "rotated")
+ if grid_mapping is None:
+ crs_str = ""
+ elif grid_mapping == "latlon":
+ crs_str = """
+ int crs ;
+ crs:grid_mapping_name = "latitude_longitude" ;
+ crs:semi_major_axis = 6371000.0 ;
+ crs:inverse_flattening = 1000. ;
+"""
+ elif grid_mapping == "rotated":
+ crs_str = """
+ int crs ;
+ crs:grid_mapping_name = "rotated_latitude_longitude" ;
+ crs:grid_north_pole_latitude = 32.5 ;
+ crs:grid_north_pole_longitude = 170. ;
+"""
+
+ cdl_string = f"""
+netcdf test {{
+ dimensions:
+ {var_name} = 2 ;
+ variables:
+ double {var_name}({var_name}) ;
+ {standard_name_str}
+ {units_str}
+ {long_name_str}
+ {axis_str}
+ double phenom({var_name}) ;
+ phenom:standard_name = "air_temperature" ;
+ phenom:units = "K" ;
+ {grid_mapping_str}
+ {crs_str}
+ data:
+ {var_name} = 0., 1. ;
+}}
+"""
+ return cdl_string
+
+ def check_result(
+ self,
+ cube,
+ standard_name,
+ long_name,
+ units,
+ crs=None,
+ context_message="",
+ ):
+ # Check the existence, standard-name, long-name, units and coord-system
+ # of the resulting coord. Also that it is always a dim-coord.
+ # NOTE: there is no "axis" arg, as this information does *not* appear
+ # as a separate property (or attribute) of the resulting coord.
+ # However, whether the file variable has an axis attribute *does*
+ # affect the results here, in some cases.
+ coords = cube.coords()
+ # There should be one and only one coord.
+ self.assertEqual(1, len(coords))
+ # It should also be a dim-coord
+ self.assertEqual(1, len(cube.coords(dim_coords=True)))
+ (coord,) = coords
+ if self.debug:
+ print("")
+ print("DEBUG : result coord =", coord)
+ print("")
+
+ coord_stdname, coord_longname, coord_units, coord_crs = [
+ getattr(coord, name)
+ for name in ("standard_name", "long_name", "units", "coord_system")
+ ]
+ self.assertEqual(standard_name, coord_stdname, context_message)
+ self.assertEqual(long_name, coord_longname, context_message)
+ self.assertEqual(units, coord_units, context_message)
+ assert crs in (None, "latlon", "rotated")
+ if crs is None:
+ self.assertEqual(None, coord_crs, context_message)
+ elif crs == "latlon":
+ self.assertIsInstance(coord_crs, GeogCS, context_message)
+ elif crs == "rotated":
+ self.assertIsInstance(coord_crs, RotatedGeogCS, context_message)
+
+ #
+ # Testcase routines
+ #
+ # NOTE: all these testcases have been verified against the older behaviour
+ # in v3.0.4, based on Pyke rules.
+ #
+
+ def test_minimal(self):
+ # Nothing but a var-name --> unrecognised dim-coord.
+ result = self.run_testcase()
+ self.check_result(result, None, None, "unknown")
+
+ def test_fullinfo_unrotated(self):
+ # Check behaviour with all normal info elements for 'unrotated' case.
+ # Includes a grid-mapping, but no axis (should not be needed).
+ result = self.run_testcase(
+ standard_name=self.unrotated_name,
+ units=self.unrotated_units,
+ grid_mapping="latlon",
+ )
+ self.check_result(
+ result, self.unrotated_name, None, "degrees", "latlon"
+ )
+
+ def test_fullinfo_rotated(self):
+ # Check behaviour with all normal info elements for 'rotated' case.
+ # Includes a grid-mapping, but no axis (should not be needed).
+ result = self.run_testcase(
+ standard_name=self.rotated_name,
+ units=self.rotated_units,
+ grid_mapping="rotated",
+ )
+ self.check_result(
+ result, self.rotated_name, None, "degrees", "rotated"
+ )
+
+ def test_axis(self):
+ # A suitable axis --> unrotated lat/lon coord, but unknown units.
+ result = self.run_testcase(axis=self.axis)
+ self.check_result(result, self.unrotated_name, None, "unknown")
+
+ def test_units_unrotated(self):
+ # With a unit like 'degrees_east', we automatically identify this as a
+ # latlon coord, *and* convert units to plain 'degrees' on loading.
+ result = self.run_testcase(units=self.unrotated_units)
+ self.check_result(result, self.unrotated_name, None, "degrees")
+
+ def test_units_rotated(self):
+ # With no info except a "degrees" unit, we **don't** identify a latlon,
+ # i.e. we do not set the standard-name
+ result = self.run_testcase(units="degrees")
+ self.check_result(result, None, None, "degrees")
+
+ def test_units_unrotated_gridmapping(self):
+ # With an unrotated unit *AND* a suitable grid-mapping, we identify a
+ # rotated latlon coordinate + assign it the coord-system.
+ result = self.run_testcase(
+ units=self.unrotated_units, grid_mapping="latlon"
+ )
+ self.check_result(
+ result, self.unrotated_name, None, "degrees", "latlon"
+ )
+
+ def test_units_rotated_gridmapping_noname(self):
+ # Rotated units and grid-mapping, but *without* the expected name.
+ # Does not translate, no coord-system (i.e. grid-mapping is discarded).
+ result = self.run_testcase(
+ units="degrees",
+ grid_mapping="rotated",
+ )
+ self.check_result(result, None, None, "degrees", None)
+
+ def test_units_rotated_gridmapping_withname(self):
+ # With a "degrees" unit, a rotated grid-mapping *AND* a suitable
+ # standard-name, it recognises a rotated dimcoord.
+ result = self.run_testcase(
+ standard_name=self.rotated_name,
+ units="degrees",
+ grid_mapping="rotated",
+ )
+ self.check_result(
+ result, self.rotated_name, None, "degrees", "rotated"
+ )
+
+ def test_units_rotated_gridmapping_varname(self):
+ # Same but with var-name containing the standard-name : in this case we
+ # get NO COORDINATE-SYSTEM (which is a bit weird).
+ result = self.run_testcase(
+ var_name=self.rotated_name,
+ units="degrees",
+ grid_mapping="rotated",
+ )
+ self.check_result(result, self.rotated_name, None, "degrees", None)
+
+ def test_varname_unrotated(self):
+ # With a recognised name in the var-name, we set standard-name.
+ # But units are left undetermined.
+ result = self.run_testcase(var_name=self.unrotated_name)
+ self.check_result(result, self.unrotated_name, None, "unknown")
+
+ def test_varname_rotated(self):
+ # With a *rotated* name in the var-name, we set standard-name.
+ # But units are left undetermined.
+ result = self.run_testcase(var_name=self.rotated_name)
+ self.check_result(result, self.rotated_name, None, "unknown")
+
+ def test_varname_unrotated_units_rotated(self):
+ # With a "degrees" unit and a suitable var-name, we do identify
+ # (= set standard-name).
+ # N.B. this accepts "degrees" as a generic term, and so does *not*
+ # interpret it as a rotated coordinate.
+ result = self.run_testcase(
+ var_name=self.unrotated_name, units="degrees"
+ )
+ self.check_result(result, self.unrotated_name, None, "degrees")
+
+ def test_longname(self):
+ # A recognised form in long-name is *not* translated into standard-name.
+ result = self.run_testcase(long_name=self.unrotated_name)
+ self.check_result(result, None, self.unrotated_name, "unknown")
+
+ def test_stdname_unrotated(self):
+ # Only an (unrotated) standard name : units is not specified
+ result = self.run_testcase(standard_name=self.unrotated_name)
+ self.check_result(result, self.unrotated_name, None, None)
+
+ def test_stdname_rotated(self):
+ # Only a (rotated) standard name : units is not specified
+ result = self.run_testcase(standard_name=self.rotated_name)
+ self.check_result(result, self.rotated_name, None, None)
+
+ def test_stdname_unrotated_gridmapping(self):
+ # An unrotated standard-name and grid-mapping, translates into a
+ # coordinate system.
+ result = self.run_testcase(
+ standard_name=self.unrotated_name, grid_mapping="latlon"
+ )
+ self.check_result(
+ result, self.unrotated_name, None, "unknown", "latlon"
+ )
+
+ def test_stdname_rotated_gridmapping(self):
+ # An *rotated* standard-name and grid-mapping, translates into a
+ # coordinate system.
+ result = self.run_testcase(
+ standard_name=self.rotated_name, grid_mapping="rotated"
+ )
+ self.check_result(result, self.rotated_name, None, None, "rotated")
+
+
+class Test__longitude_coords(Mixin_latlon_dimcoords, tests.IrisTest):
+ lat_1_or_lon_0 = 0
+
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+
+ @classmethod
+ def tearDownClass(cls):
+ super().tearDownClass()
+
+ def setUp(self):
+ super().setUp()
+
+
+class Test__latitude_coords(Mixin_latlon_dimcoords, tests.IrisTest):
+ lat_1_or_lon_0 = 1
+
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+
+ @classmethod
+ def tearDownClass(cls):
+ super().tearDownClass()
+
+ def setUp(self):
+ super().setUp()
+
+
+if __name__ == "__main__":
+ tests.main()
diff --git a/requirements/ci/nox.lock/py37-linux-64.lock b/requirements/ci/nox.lock/py37-linux-64.lock
index 19de3427687..06bcca68f8b 100644
--- a/requirements/ci/nox.lock/py37-linux-64.lock
+++ b/requirements/ci/nox.lock/py37-linux-64.lock
@@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.36.1-hea4e1c9
https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-11.2.0-h5c6108e_11.tar.bz2#2dcb18a9a0fa31f4f29e5a9b3eade394
https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-11.2.0-he4da1e4_11.tar.bz2#0bf83958e788f1e75ba26154cb702afe
https://conda.anaconda.org/conda-forge/linux-64/mpi-1.0-mpich.tar.bz2#c1fcff3417b5a22bbc4cf6e8c23648cf
-https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.27-ha770c72_2.tar.bz2#17460296fbd27310a0d796115d79c930
+https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.27-ha770c72_3.tar.bz2#49210aaa9080888f9f9b460c70202bd3
https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29
https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-11.2.0-h69a702a_11.tar.bz2#4ea2f9f83b617a7682e8aa05dcb37c6a
https://conda.anaconda.org/conda-forge/linux-64/libgomp-11.2.0-h1d223b6_11.tar.bz2#1d16527c76842bf9c41e9399d39d8097
@@ -22,7 +22,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-11.2.0-h1d223b6_11.tar
https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.3-h516909a_0.tar.bz2#1378b88874f42ac31b2f8e4f6975cb7b
https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54
https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.18.1-h7f98852_0.tar.bz2#f26ef8098fab1f719c91eb760d63381a
-https://conda.anaconda.org/conda-forge/linux-64/expat-2.4.1-h9c3ff4c_0.tar.bz2#16054ef3cb3ec5d8d29d08772662f65d
+https://conda.anaconda.org/conda-forge/linux-64/expat-2.4.2-h9c3ff4c_0.tar.bz2#0fb039650fa638f258fdc9e9ef125f52
https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8
https://conda.anaconda.org/conda-forge/linux-64/geos-3.10.1-h9c3ff4c_1.tar.bz2#17a5f413039ce1e105fab5df9c668eb5
https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h36c2ea0_2.tar.bz2#626e68ae9cc5912d6adb79d318cf962d
@@ -46,7 +46,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.32.1-h7f98852_1000.tar
https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.1-h7f98852_0.tar.bz2#90607c4c0247f04ec98b48997de71c1a
https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.11-h36c2ea0_1013.tar.bz2#dcddf696ff5dfcab567100d691678e18
https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.3-h9c3ff4c_1.tar.bz2#fbe97e8fa6f275d7c76a09e795adc3e6
-https://conda.anaconda.org/conda-forge/linux-64/mpich-3.4.2-h846660c_101.tar.bz2#9478c28797583eff62a58853f92ad7f6
+https://conda.anaconda.org/conda-forge/linux-64/mpich-3.4.3-h846660c_100.tar.bz2#1bb747e2de717cb9a6501d72539d6556
https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.2-h58526e2_4.tar.bz2#509f2a21c4a09214cd737a480dfd80c9
https://conda.anaconda.org/conda-forge/linux-64/nspr-4.32-h9c3ff4c_1.tar.bz2#29ded371806431b0499aaee146abfc3e
https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1l-h7f98852_0.tar.bz2#de7b38a1542dbe6f41653a8ae71adc53
@@ -75,32 +75,35 @@ https://conda.anaconda.org/conda-forge/linux-64/readline-8.1-h46c0cb4_0.tar.bz2#
https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.27.27-hc3e0081_3.tar.bz2#a47110f41fcbf88fcdf8549d7f69a6d8
https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.3-hd9c2040_1000.tar.bz2#9e856f78d5c80d5a78f61e72d1d473a3
https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.11-h36c2ea0_1013.tar.bz2#cf7190238072a41e9579e4476a6a60b8
+https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.1-ha95c52a_0.tar.bz2#4eec219a4bd69c11579601804cec5baf
https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h7f98852_6.tar.bz2#9e94bf16f14c78a36561d5019f490d22
https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h10796ff_3.tar.bz2#21a8d66dc17f065023b33145c42652fe
https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-12_linux64_openblas.tar.bz2#2e5082d4a9a18c21100e6ce5b6bcb4ec
-https://conda.anaconda.org/conda-forge/linux-64/libglib-2.70.2-h174f98d_0.tar.bz2#76dc12f1c2366b02b9e21773fe122aeb
+https://conda.anaconda.org/conda-forge/linux-64/libglib-2.70.2-h174f98d_1.tar.bz2#d03a54631298fd1ab732ff65f6ed3a07
https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-12_linux64_openblas.tar.bz2#9f401a6807a97e0c859d7522ae3d51ec
https://conda.anaconda.org/conda-forge/linux-64/libllvm11-11.1.0-hf817b99_2.tar.bz2#646fa2f7c60b69ee8f918668e9c2fd31
https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.43.0-h812cca2_1.tar.bz2#d0a7846b7b3b8fb0d8b36904a53b8155
https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.37-h21135ba_2.tar.bz2#b6acf807307d033d4b7e758b4f44b036
https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-ha56f1ee_2.tar.bz2#6ab4eaa11ff01801cffca0a27489dc04
+https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.3.0-h6f004c6_2.tar.bz2#34fda41ca84e67232888c9a885903055
https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.9.12-h72842e0_0.tar.bz2#bd14fdf5b9ee5568056a40a6a2f41866
https://conda.anaconda.org/conda-forge/linux-64/libzip-1.8.0-h4de3113_1.tar.bz2#175a746a43d42c053b91aa765fbc197d
+https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.27-hfa10184_3.tar.bz2#7cd299934880b05703ee86a62325982f
https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.37.0-h9cd32fc_0.tar.bz2#eb66fc098824d25518a79e83d12a81d6
https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.11-h27826a3_1.tar.bz2#84e76fb280e735fec1efd2d21fd9cb27
https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.7.2-h7f98852_0.tar.bz2#12a61e640b8894504326aadafccbb790
-https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.0-ha95c52a_0.tar.bz2#b56f94865e2de36abf054e7bfa499034
https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.36.0-h3371d22_4.tar.bz2#661e1ed5d92552785d9f8c781ce68685
https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h7f98852_6.tar.bz2#612385c4a83edb0619fe911d9da317f4
+https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d
https://conda.anaconda.org/conda-forge/linux-64/freetype-2.10.4-h0708190_1.tar.bz2#4a06f2ac2e5bfae7b6b245171c3f07aa
-https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.70.2-h780b84a_0.tar.bz2#667ba134b9e86e9f000d6e67a39e22f5
+https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.6-h04a7f16_0.tar.bz2#b24a1e18325a6e8f8b6b4a2ec5860ce2
https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.18.5-h9f60fe5_2.tar.bz2#6221115a24700aa8598ae5aa1574902d
https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h64030ff_2.tar.bz2#112eb9b5b93f0c02e59aea4fd1967363
https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.2-hcc1bbae_3.tar.bz2#e29650992ae593bc05fc93722483e5c3
+https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.12-hddcbb42_0.tar.bz2#797117394a4aa588de6d741b06fad80f
https://conda.anaconda.org/conda-forge/linux-64/libclang-11.1.0-default_ha53f305_1.tar.bz2#b9b71585ca4fcb5d442c5a9df5dd7e98
-https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.3.0-h6f004c6_2.tar.bz2#34fda41ca84e67232888c9a885903055
+https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.1-h3452ae3_0.tar.bz2#6d4bf6265d998b6c975c26a6a24062a2
https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.0.3-he3ba5ed_0.tar.bz2#f9dbabc7e01c459ed7a1d1d64b206e9b
-https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.27-hfa10184_2.tar.bz2#8e2e8f9dcbd12b482be6bf8474bb1d34
https://conda.anaconda.org/conda-forge/linux-64/nss-3.73-hb5efdd6_0.tar.bz2#a5b91a14292ac34bac1f0506a3772fd5
https://conda.anaconda.org/conda-forge/linux-64/python-3.7.12-hb7a2778_100_cpython.tar.bz2#2d94b3e6a9fdaf83f6955d008c8011a7
https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h7f98852_1.tar.bz2#536cc5db4d0a3ba0630541aec064b5e4
@@ -113,19 +116,15 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.0.0-pyhd8ed1ab_0.tar
https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.4-pyh9f0ad1d_0.tar.bz2#c08b4c1326b880ed44f3ffb04803332f
https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb
https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.4-pyhd8ed1ab_0.tar.bz2#7b50d840543d9cdae100e91582c33035
-https://conda.anaconda.org/conda-forge/noarch/filelock-3.4.0-pyhd8ed1ab_0.tar.bz2#caff9785491992b3250ed4048fe51e2c
+https://conda.anaconda.org/conda-forge/noarch/filelock-3.4.2-pyhd8ed1ab_0.tar.bz2#d05900c9b0ef4c3d1cef2e8a5c49350e
https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.13.1-hba837de_1005.tar.bz2#fd3611672eb91bc9d24fd6fb970037eb
https://conda.anaconda.org/conda-forge/noarch/fsspec-2021.11.1-pyhd8ed1ab_0.tar.bz2#a510ec93fdb50775091d2afba98a8acb
-https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.6-h04a7f16_0.tar.bz2#b24a1e18325a6e8f8b6b4a2ec5860ce2
-https://conda.anaconda.org/conda-forge/linux-64/glib-2.70.2-h780b84a_0.tar.bz2#715dda657174cfd3a312c8b6694fd6ca
https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.18.5-hf529b03_2.tar.bz2#3cf866063f2803944ddaee8b1d6da531
https://conda.anaconda.org/conda-forge/noarch/idna-3.1-pyhd3deb0d_0.tar.bz2#9c9aea4b8391264477df484f798562d0
https://conda.anaconda.org/conda-forge/noarch/imagesize-1.3.0-pyhd8ed1ab_0.tar.bz2#be807e7606fff9436e5e700f6bffb7c6
https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_0.tar.bz2#18ee9c07cf945a33f92caf1ee3d23ad9
-https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.12-hddcbb42_0.tar.bz2#797117394a4aa588de6d741b06fad80f
https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.80.0-h2574ce0_0.tar.bz2#5d0784b790350f7939bb5d3f2c32e700
https://conda.anaconda.org/conda-forge/linux-64/libpq-13.5-hd57d9b9_1.tar.bz2#a0f425d61c7df890d6381ea352c3f1d7
-https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.1-h3452ae3_0.tar.bz2#6d4bf6265d998b6c975c26a6a24062a2
https://conda.anaconda.org/conda-forge/noarch/locket-0.2.0-py_2.tar.bz2#709e8671651c7ec3d1ad07800339ff1d
https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19
https://conda.anaconda.org/conda-forge/noarch/nose-1.3.7-py_1006.tar.bz2#382019d5f8e9362ef6f60a8d4e7bce8f
@@ -145,7 +144,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.ta
https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095
https://conda.anaconda.org/conda-forge/noarch/toolz-0.11.2-pyhd8ed1ab_0.tar.bz2#f348d1590550371edfac5ed3c1d44f7e
https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.0.1-pyha770c72_0.tar.bz2#1fc03816925d3cb7fdab9ab234e7fea7
-https://conda.anaconda.org/conda-forge/noarch/wheel-0.37.0-pyhd8ed1ab_1.tar.bz2#3aa2c3e25dd361b453d010388b9cdff1
+https://conda.anaconda.org/conda-forge/noarch/wheel-0.37.1-pyhd8ed1ab_0.tar.bz2#1ca02aaf78d9c70d9a81a3bed5752022
https://conda.anaconda.org/conda-forge/noarch/zipp-3.6.0-pyhd8ed1ab_0.tar.bz2#855e2c4622f5eb50a4f6f7167b9ba17a
https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py37h89c1867_1003.tar.bz2#490366305378c8690b65c4bce9b9f6a4
https://conda.anaconda.org/conda-forge/noarch/babel-2.9.1-pyh44b312d_0.tar.bz2#74136ed39bfea0832d338df1e58d013e
@@ -153,16 +152,15 @@ https://conda.anaconda.org/conda-forge/linux-64/cairo-1.16.0-h6cf1ce9_1008.tar.b
https://conda.anaconda.org/conda-forge/linux-64/certifi-2021.10.8-py37h89c1867_1.tar.bz2#48e8442b6097c7d4a0e3494c74ff9eeb
https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.0-py37h036bc23_0.tar.bz2#05ab26c7685bcb7dd8bc8752c121f823
https://conda.anaconda.org/conda-forge/linux-64/curl-7.80.0-h2574ce0_0.tar.bz2#4d8fd67e5ab7e00fde8ad085464f43b7
-https://conda.anaconda.org/conda-forge/linux-64/cython-0.29.25-py37hcd2ae1e_0.tar.bz2#4e9a69a5815f562d2bb1379ebbb63c19
-https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h48d8840_2.tar.bz2#eba672c69baf366fdedd1c6f702dbb81
+https://conda.anaconda.org/conda-forge/linux-64/cython-0.29.26-py37hcd2ae1e_0.tar.bz2#ab81ddd8474c4cee87fe2f9ef163f44f
https://conda.anaconda.org/conda-forge/linux-64/docutils-0.17.1-py37h89c1867_1.tar.bz2#e0a3be74a594032b73f22762ba9941cc
https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.1-mpi_mpich_h9c45103_3.tar.bz2#4f1a733e563d27b98010b62888e149c9
-https://conda.anaconda.org/conda-forge/linux-64/importlib-metadata-4.8.2-py37h89c1867_0.tar.bz2#a62f2bad6654c1a91e3241ca7979fe05
+https://conda.anaconda.org/conda-forge/linux-64/importlib-metadata-4.10.0-py37h89c1867_0.tar.bz2#5187ab9fedd67074b301ba81ae01fd45
https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.3.2-py37h2527ec5_1.tar.bz2#441ac4d93d0d57d21ea9dcac48cb5d0d
https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h6ad9fb6_0.tar.bz2#45142dc44fcd04934f9ad68ce205e54d
https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.0.1-py37h5e8e339_1.tar.bz2#6c7c14c95d4c435b66261639b64c7c51
https://conda.anaconda.org/conda-forge/linux-64/mpi4py-3.1.3-py37h1e5cb63_0.tar.bz2#3d5ca9f081a7756df4f027776ff23b73
-https://conda.anaconda.org/conda-forge/linux-64/numpy-1.21.4-py37h31617e3_0.tar.bz2#332cef055880482fe23f6ac1e7ee6e57
+https://conda.anaconda.org/conda-forge/linux-64/numpy-1.21.5-py37hf2998dd_0.tar.bz2#ae1049dd3d8d15fc02af2f417cff5494
https://conda.anaconda.org/conda-forge/noarch/packaging-21.3-pyhd8ed1ab_0.tar.bz2#71f1ab2de48613876becddd496371c85
https://conda.anaconda.org/conda-forge/noarch/partd-1.2.0-pyhd8ed1ab_0.tar.bz2#0c32f563d7f22e3a34c95cad8cc95651
https://conda.anaconda.org/conda-forge/linux-64/pillow-6.2.2-py37h718be6c_0.tar.bz2#ecac4e308b87ff93d44ea5e56ab39084
@@ -173,56 +171,56 @@ https://conda.anaconda.org/conda-forge/linux-64/pysocks-1.7.1-py37h89c1867_4.tar
https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984
https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-2.0.2-py37h5e8e339_1.tar.bz2#c89489cddb9e53155e241e9aacd35e4b
https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py37h5e8e339_3.tar.bz2#7f167ecf4d4771ee33589e09479238e7
-https://conda.anaconda.org/conda-forge/linux-64/setuptools-59.4.0-py37h89c1867_0.tar.bz2#01f5271a7c204862ca564ee63b35548d
+https://conda.anaconda.org/conda-forge/linux-64/qt-5.12.9-hda022c4_4.tar.bz2#afebab1f5049d66baaaec67d9ce893f0
+https://conda.anaconda.org/conda-forge/linux-64/setuptools-60.2.0-py37h89c1867_0.tar.bz2#2ad2bbd333df969fb4ecadbabec85603
https://conda.anaconda.org/conda-forge/linux-64/tornado-6.1-py37h5e8e339_2.tar.bz2#ec86ae00c96dea5f2d810957a8fabc26
-https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-13.0.0.post2-py37h5e8e339_4.tar.bz2#6702ec56e12a0be3c70bf05991187bfd
+https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-14.0.0-py37h5e8e339_0.tar.bz2#9f4ac5fb219d7c63c3c3cd9c630b81a6
https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py37h5e8e339_1003.tar.bz2#4ad2e74470a3c08b0f6d59699f0d9a32
https://conda.anaconda.org/conda-forge/linux-64/cftime-1.5.1.1-py37hb1e94ed_1.tar.bz2#1b5b81088bc7d7e0bef7de4ef4bd1221
-https://conda.anaconda.org/conda-forge/linux-64/cryptography-36.0.0-py37hf1a17b8_0.tar.bz2#2fd357ed549ff7f39a04f329938de4b3
+https://conda.anaconda.org/conda-forge/linux-64/cryptography-36.0.1-py37hf1a17b8_0.tar.bz2#7ad2c98aaab85d80017b3a6f79a2aa5d
https://conda.anaconda.org/conda-forge/noarch/dask-core-2021.12.0-pyhd8ed1ab_0.tar.bz2#e572bf40b1e8783fed2526ecb5f5209e
https://conda.anaconda.org/conda-forge/linux-64/editdistance-s-1.0.0-py37h2527ec5_2.tar.bz2#9aba6bcb02d12dbd2fead23b85720712
-https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.28.3-py37h5e8e339_0.tar.bz2#5b7840e065bcdbfc6aaa72d772fcd190
+https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.28.5-py37h5e8e339_0.tar.bz2#3761f28aaafe435080d26b00fbcd7af8
https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-3.1.1-h83ec7ef_0.tar.bz2#ca8faaee04a83e3c4d6f708a35ac2ec3
-https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-4.8.2-hd8ed1ab_0.tar.bz2#4fcc9776fdf4c35c5a10662bbbd21a61
+https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-4.10.0-hd8ed1ab_0.tar.bz2#1de4b4503b2803c1b0fcba6bb91ab274
https://conda.anaconda.org/conda-forge/noarch/jinja2-3.0.3-pyhd8ed1ab_0.tar.bz2#036d872c653780cb26e797e2e2f61b4c
https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-mpi_mpich_h319fa22_1.tar.bz2#7583fbaea3648f692c0c019254bc196c
https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py37hb1e94ed_1006.tar.bz2#e06cf91c2624284413641be2cb8c3198
https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.6.0-pyhd8ed1ab_0.tar.bz2#0941325bf48969e2b3b19d0951740950
-https://conda.anaconda.org/conda-forge/linux-64/pandas-1.3.4-py37he8f5f7f_1.tar.bz2#b8e4308f454bc3e9ceeab49eb7fe7405
+https://conda.anaconda.org/conda-forge/linux-64/pandas-1.3.5-py37he8f5f7f_0.tar.bz2#6ebf1968b199a141a5cce6adaedb3651
https://conda.anaconda.org/conda-forge/noarch/pip-21.3.1-pyhd8ed1ab_0.tar.bz2#e4fe2a9af78ff11f1aced7e62128c6a8
-https://conda.anaconda.org/conda-forge/noarch/pygments-2.10.0-pyhd8ed1ab_0.tar.bz2#32bcce837f1316f1c3208118b6c5e5fc
+https://conda.anaconda.org/conda-forge/noarch/pygments-2.11.1-pyhd8ed1ab_0.tar.bz2#6f857f10fe2960dce20d59d71a290d51
https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.2.1-py37hb589d83_5.tar.bz2#ea78cbba7d43ad17ec043a9ebdee3bf5
+https://conda.anaconda.org/conda-forge/linux-64/pyqt-impl-5.12.3-py37hac37412_8.tar.bz2#148f2e971a67831ed0691f63cd826468
https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.1.1-py37h6f94858_1004.tar.bz2#42b37830a63405589fef3d13db505e7d
https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.2.0-py37hb1e94ed_1.tar.bz2#3a94b25c520754b56cdfa7d865806524
-https://conda.anaconda.org/conda-forge/linux-64/qt-5.12.9-hda022c4_4.tar.bz2#afebab1f5049d66baaaec67d9ce893f0
https://conda.anaconda.org/conda-forge/linux-64/scipy-1.7.3-py37hf2a6cf1_0.tar.bz2#129c613e1d0f09d9fd0473a0da6161a9
https://conda.anaconda.org/conda-forge/linux-64/shapely-1.8.0-py37h9b0f7a3_4.tar.bz2#568474687cd6be5f834cb682637ac0de
https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-napoleon-0.7-py_0.tar.bz2#0bc25ff6f2e34af63ded59692df5f749
https://conda.anaconda.org/conda-forge/linux-64/virtualenv-20.4.7-py37h89c1867_1.tar.bz2#cbe5a8c8ae88d1e73b4297a73d08408a
-https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.0.1-py37hb1e94ed_1.tar.bz2#63d03e033e18576d104474a76d56b6de
+https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.0.1-py37hb1e94ed_2.tar.bz2#ba9daa43279450692efc63037867ed93
https://conda.anaconda.org/conda-forge/noarch/identify-2.3.7-pyhd8ed1ab_0.tar.bz2#ae1a5e834fbca62ee88ab55fb276be63
https://conda.anaconda.org/conda-forge/noarch/imagehash-4.2.1-pyhd8ed1ab_0.tar.bz2#01cc8698b6e1a124dc4f585516c27643
-https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.5.0-py37h1058ff1_0.tar.bz2#de800e20af9257645b36eac046b98080
+https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.5.1-py37h1058ff1_0.tar.bz2#b431c18c1cf130f03d83498f2ef7047b
https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.5.3-mpi_mpich_h1364a43_6.tar.bz2#9caa0cf923af3d037897c6d7f8ea57c0
https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.5.8-nompi_py37hf784469_101.tar.bz2#5b05dc55e51be0696878e9a575c12f77
https://conda.anaconda.org/conda-forge/linux-64/pango-1.48.10-h54213e6_2.tar.bz2#b7ed7c76c9360db1f91afba2e220007b
https://conda.anaconda.org/conda-forge/noarch/pyopenssl-21.0.0-pyhd8ed1ab_0.tar.bz2#8c49efecb7dca466e18b06015e8c88ce
-https://conda.anaconda.org/conda-forge/linux-64/pyqt-impl-5.12.3-py37hac37412_8.tar.bz2#148f2e971a67831ed0691f63cd826468
+https://conda.anaconda.org/conda-forge/linux-64/pyqtchart-5.12-py37he336c9b_8.tar.bz2#2fe25d82cb4e59191df561c40870ca6b
+https://conda.anaconda.org/conda-forge/linux-64/pyqtwebengine-5.12.1-py37he336c9b_8.tar.bz2#0a67d477c0524897883ca0f86d6fb15c
https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.20.1-py37h9a08e6e_5.tar.bz2#e44dc116f747b0a7bceaf1533acc6b48
https://conda.anaconda.org/conda-forge/linux-64/esmf-8.2.0-mpi_mpich_h4975321_100.tar.bz2#56f5c650937b1667ad0a557a0dff3bc4
https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h539f30e_1.tar.bz2#606777b4da3664d5c9415f5f165349fd
-https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.52.4-hc3c00ef_0.tar.bz2#310ae1e113d6febc26fe3b44e3519757
+https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.52.5-hc3c00ef_0.tar.bz2#43694e152ee85559ddf64b1acb8801dd
https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.0-pyhd8ed1ab_0.tar.bz2#9113b4e4fa2fa4a7f129c71a6f319475
https://conda.anaconda.org/conda-forge/linux-64/pre-commit-2.16.0-py37h89c1867_0.tar.bz2#43b270fe44130353e540037ad27da097
-https://conda.anaconda.org/conda-forge/linux-64/pyqtchart-5.12-py37he336c9b_8.tar.bz2#2fe25d82cb4e59191df561c40870ca6b
-https://conda.anaconda.org/conda-forge/linux-64/pyqtwebengine-5.12.1-py37he336c9b_8.tar.bz2#0a67d477c0524897883ca0f86d6fb15c
+https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.12.3-py37h89c1867_8.tar.bz2#8038f9765a907fcf6fdfa6a9db71e371
https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.7-pyhd8ed1ab_0.tar.bz2#be75bab4820a56f77ba1a3fc9139c36a
https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.2.0-mpi_mpich_py37h7352969_101.tar.bz2#64fd02e7a0cefe0b5c604fea03774c73
https://conda.anaconda.org/conda-forge/linux-64/graphviz-2.50.0-h85b4f2f_1.tar.bz2#bc6418fd87ea67cf14417337ced3daa2
-https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.12.3-py37h89c1867_8.tar.bz2#8038f9765a907fcf6fdfa6a9db71e371
+https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.5.1-py37h89c1867_0.tar.bz2#b14435faa62d35cea49a9183d595f145
https://conda.anaconda.org/conda-forge/noarch/requests-2.26.0-pyhd8ed1ab_1.tar.bz2#358581cc782802270d77c454c73a811a
-https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.5.0-py37h89c1867_0.tar.bz2#dc2167a62be1ca5253727201368ddc89
-https://conda.anaconda.org/conda-forge/noarch/sphinx-4.3.1-pyh6c4a22f_0.tar.bz2#74d14a40bf09d1d8d788a8433f04e0d8
+https://conda.anaconda.org/conda-forge/noarch/sphinx-4.3.2-pyh6c4a22f_0.tar.bz2#e8ffaea0961c0d7a6767f2394042043d
https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.4.0-pyhd8ed1ab_0.tar.bz2#80fd2cc25ad45911b4e42d5b91593e2f
https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.10.1-pyhd8ed1ab_0.tar.bz2#4918585fe5e5341740f7e63c61743efb
https://conda.anaconda.org/conda-forge/noarch/sphinx-panels-0.6.0-pyhd8ed1ab_0.tar.bz2#6eec6480601f5d15babf9c3b3987f34a
diff --git a/requirements/ci/nox.lock/py38-linux-64.lock b/requirements/ci/nox.lock/py38-linux-64.lock
index de3e1a46f47..97fdfc68b26 100644
--- a/requirements/ci/nox.lock/py38-linux-64.lock
+++ b/requirements/ci/nox.lock/py38-linux-64.lock
@@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.36.1-hea4e1c9
https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-11.2.0-h5c6108e_11.tar.bz2#2dcb18a9a0fa31f4f29e5a9b3eade394
https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-11.2.0-he4da1e4_11.tar.bz2#0bf83958e788f1e75ba26154cb702afe
https://conda.anaconda.org/conda-forge/linux-64/mpi-1.0-mpich.tar.bz2#c1fcff3417b5a22bbc4cf6e8c23648cf
-https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.27-ha770c72_2.tar.bz2#17460296fbd27310a0d796115d79c930
+https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.27-ha770c72_3.tar.bz2#49210aaa9080888f9f9b460c70202bd3
https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29
https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-11.2.0-h69a702a_11.tar.bz2#4ea2f9f83b617a7682e8aa05dcb37c6a
https://conda.anaconda.org/conda-forge/linux-64/libgomp-11.2.0-h1d223b6_11.tar.bz2#1d16527c76842bf9c41e9399d39d8097
@@ -22,7 +22,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-11.2.0-h1d223b6_11.tar
https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.3-h516909a_0.tar.bz2#1378b88874f42ac31b2f8e4f6975cb7b
https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54
https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.18.1-h7f98852_0.tar.bz2#f26ef8098fab1f719c91eb760d63381a
-https://conda.anaconda.org/conda-forge/linux-64/expat-2.4.1-h9c3ff4c_0.tar.bz2#16054ef3cb3ec5d8d29d08772662f65d
+https://conda.anaconda.org/conda-forge/linux-64/expat-2.4.2-h9c3ff4c_0.tar.bz2#0fb039650fa638f258fdc9e9ef125f52
https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8
https://conda.anaconda.org/conda-forge/linux-64/geos-3.10.1-h9c3ff4c_1.tar.bz2#17a5f413039ce1e105fab5df9c668eb5
https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h36c2ea0_2.tar.bz2#626e68ae9cc5912d6adb79d318cf962d
@@ -46,7 +46,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.32.1-h7f98852_1000.tar
https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.1-h7f98852_0.tar.bz2#90607c4c0247f04ec98b48997de71c1a
https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.11-h36c2ea0_1013.tar.bz2#dcddf696ff5dfcab567100d691678e18
https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.3-h9c3ff4c_1.tar.bz2#fbe97e8fa6f275d7c76a09e795adc3e6
-https://conda.anaconda.org/conda-forge/linux-64/mpich-3.4.2-h846660c_101.tar.bz2#9478c28797583eff62a58853f92ad7f6
+https://conda.anaconda.org/conda-forge/linux-64/mpich-3.4.3-h846660c_100.tar.bz2#1bb747e2de717cb9a6501d72539d6556
https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.2-h58526e2_4.tar.bz2#509f2a21c4a09214cd737a480dfd80c9
https://conda.anaconda.org/conda-forge/linux-64/nspr-4.32-h9c3ff4c_1.tar.bz2#29ded371806431b0499aaee146abfc3e
https://conda.anaconda.org/conda-forge/linux-64/openssl-1.1.1l-h7f98852_0.tar.bz2#de7b38a1542dbe6f41653a8ae71adc53
@@ -75,32 +75,34 @@ https://conda.anaconda.org/conda-forge/linux-64/readline-8.1-h46c0cb4_0.tar.bz2#
https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.27.27-hc3e0081_3.tar.bz2#a47110f41fcbf88fcdf8549d7f69a6d8
https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.3-hd9c2040_1000.tar.bz2#9e856f78d5c80d5a78f61e72d1d473a3
https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.11-h36c2ea0_1013.tar.bz2#cf7190238072a41e9579e4476a6a60b8
+https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.1-ha95c52a_0.tar.bz2#4eec219a4bd69c11579601804cec5baf
https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h7f98852_6.tar.bz2#9e94bf16f14c78a36561d5019f490d22
https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h10796ff_3.tar.bz2#21a8d66dc17f065023b33145c42652fe
https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-12_linux64_openblas.tar.bz2#2e5082d4a9a18c21100e6ce5b6bcb4ec
-https://conda.anaconda.org/conda-forge/linux-64/libglib-2.70.2-h174f98d_0.tar.bz2#76dc12f1c2366b02b9e21773fe122aeb
+https://conda.anaconda.org/conda-forge/linux-64/libglib-2.70.2-h174f98d_1.tar.bz2#d03a54631298fd1ab732ff65f6ed3a07
https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-12_linux64_openblas.tar.bz2#9f401a6807a97e0c859d7522ae3d51ec
https://conda.anaconda.org/conda-forge/linux-64/libllvm11-11.1.0-hf817b99_2.tar.bz2#646fa2f7c60b69ee8f918668e9c2fd31
https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.43.0-h812cca2_1.tar.bz2#d0a7846b7b3b8fb0d8b36904a53b8155
https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.37-h21135ba_2.tar.bz2#b6acf807307d033d4b7e758b4f44b036
https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-ha56f1ee_2.tar.bz2#6ab4eaa11ff01801cffca0a27489dc04
+https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.3.0-h6f004c6_2.tar.bz2#34fda41ca84e67232888c9a885903055
https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.9.12-h72842e0_0.tar.bz2#bd14fdf5b9ee5568056a40a6a2f41866
https://conda.anaconda.org/conda-forge/linux-64/libzip-1.8.0-h4de3113_1.tar.bz2#175a746a43d42c053b91aa765fbc197d
+https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.27-hfa10184_3.tar.bz2#7cd299934880b05703ee86a62325982f
https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.37.0-h9cd32fc_0.tar.bz2#eb66fc098824d25518a79e83d12a81d6
https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.11-h27826a3_1.tar.bz2#84e76fb280e735fec1efd2d21fd9cb27
https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.7.2-h7f98852_0.tar.bz2#12a61e640b8894504326aadafccbb790
-https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.0-ha95c52a_0.tar.bz2#b56f94865e2de36abf054e7bfa499034
https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.36.0-h3371d22_4.tar.bz2#661e1ed5d92552785d9f8c781ce68685
https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h7f98852_6.tar.bz2#612385c4a83edb0619fe911d9da317f4
+https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d
https://conda.anaconda.org/conda-forge/linux-64/freetype-2.10.4-h0708190_1.tar.bz2#4a06f2ac2e5bfae7b6b245171c3f07aa
-https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.70.2-h780b84a_0.tar.bz2#667ba134b9e86e9f000d6e67a39e22f5
+https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.6-h04a7f16_0.tar.bz2#b24a1e18325a6e8f8b6b4a2ec5860ce2
https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.18.5-h9f60fe5_2.tar.bz2#6221115a24700aa8598ae5aa1574902d
https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h64030ff_2.tar.bz2#112eb9b5b93f0c02e59aea4fd1967363
https://conda.anaconda.org/conda-forge/linux-64/krb5-1.19.2-hcc1bbae_3.tar.bz2#e29650992ae593bc05fc93722483e5c3
https://conda.anaconda.org/conda-forge/linux-64/libclang-11.1.0-default_ha53f305_1.tar.bz2#b9b71585ca4fcb5d442c5a9df5dd7e98
-https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.3.0-h6f004c6_2.tar.bz2#34fda41ca84e67232888c9a885903055
+https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.1-h3452ae3_0.tar.bz2#6d4bf6265d998b6c975c26a6a24062a2
https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.0.3-he3ba5ed_0.tar.bz2#f9dbabc7e01c459ed7a1d1d64b206e9b
-https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.27-hfa10184_2.tar.bz2#8e2e8f9dcbd12b482be6bf8474bb1d34
https://conda.anaconda.org/conda-forge/linux-64/nss-3.73-hb5efdd6_0.tar.bz2#a5b91a14292ac34bac1f0506a3772fd5
https://conda.anaconda.org/conda-forge/linux-64/python-3.8.12-hb7a2778_2_cpython.tar.bz2#148ea076514259c7f562fbfba956a693
https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h7f98852_1.tar.bz2#536cc5db4d0a3ba0630541aec064b5e4
@@ -113,18 +115,15 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.0.0-pyhd8ed1ab_0.tar
https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.4-pyh9f0ad1d_0.tar.bz2#c08b4c1326b880ed44f3ffb04803332f
https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb
https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.4-pyhd8ed1ab_0.tar.bz2#7b50d840543d9cdae100e91582c33035
-https://conda.anaconda.org/conda-forge/noarch/filelock-3.4.0-pyhd8ed1ab_0.tar.bz2#caff9785491992b3250ed4048fe51e2c
+https://conda.anaconda.org/conda-forge/noarch/filelock-3.4.2-pyhd8ed1ab_0.tar.bz2#d05900c9b0ef4c3d1cef2e8a5c49350e
https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.13.1-hba837de_1005.tar.bz2#fd3611672eb91bc9d24fd6fb970037eb
https://conda.anaconda.org/conda-forge/noarch/fsspec-2021.11.1-pyhd8ed1ab_0.tar.bz2#a510ec93fdb50775091d2afba98a8acb
-https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.6-h04a7f16_0.tar.bz2#b24a1e18325a6e8f8b6b4a2ec5860ce2
-https://conda.anaconda.org/conda-forge/linux-64/glib-2.70.2-h780b84a_0.tar.bz2#715dda657174cfd3a312c8b6694fd6ca
https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.18.5-hf529b03_2.tar.bz2#3cf866063f2803944ddaee8b1d6da531
https://conda.anaconda.org/conda-forge/noarch/idna-3.1-pyhd3deb0d_0.tar.bz2#9c9aea4b8391264477df484f798562d0
https://conda.anaconda.org/conda-forge/noarch/imagesize-1.3.0-pyhd8ed1ab_0.tar.bz2#be807e7606fff9436e5e700f6bffb7c6
https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_0.tar.bz2#18ee9c07cf945a33f92caf1ee3d23ad9
https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.80.0-h2574ce0_0.tar.bz2#5d0784b790350f7939bb5d3f2c32e700
https://conda.anaconda.org/conda-forge/linux-64/libpq-13.5-hd57d9b9_1.tar.bz2#a0f425d61c7df890d6381ea352c3f1d7
-https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.1-h3452ae3_0.tar.bz2#6d4bf6265d998b6c975c26a6a24062a2
https://conda.anaconda.org/conda-forge/noarch/locket-0.2.0-py_2.tar.bz2#709e8671651c7ec3d1ad07800339ff1d
https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19
https://conda.anaconda.org/conda-forge/noarch/nose-1.3.7-py_1006.tar.bz2#382019d5f8e9362ef6f60a8d4e7bce8f
@@ -143,21 +142,20 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-py_0.ta
https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2#d01180388e6d1838c3e1ad029590aa7a
https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095
https://conda.anaconda.org/conda-forge/noarch/toolz-0.11.2-pyhd8ed1ab_0.tar.bz2#f348d1590550371edfac5ed3c1d44f7e
-https://conda.anaconda.org/conda-forge/noarch/wheel-0.37.0-pyhd8ed1ab_1.tar.bz2#3aa2c3e25dd361b453d010388b9cdff1
+https://conda.anaconda.org/conda-forge/noarch/wheel-0.37.1-pyhd8ed1ab_0.tar.bz2#1ca02aaf78d9c70d9a81a3bed5752022
https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py38h578d9bd_1003.tar.bz2#db8b471d9a764f561a129f94ea215c0a
https://conda.anaconda.org/conda-forge/noarch/babel-2.9.1-pyh44b312d_0.tar.bz2#74136ed39bfea0832d338df1e58d013e
https://conda.anaconda.org/conda-forge/linux-64/cairo-1.16.0-h6cf1ce9_1008.tar.bz2#a43fb47d15e116f8be4be7e6b17ab59f
https://conda.anaconda.org/conda-forge/linux-64/certifi-2021.10.8-py38h578d9bd_1.tar.bz2#52a6cee65a5d10ed1c3f0af24fb48dd3
https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.0-py38h3931269_0.tar.bz2#9c491a90ae11d08ca97326a0ed876f3a
https://conda.anaconda.org/conda-forge/linux-64/curl-7.80.0-h2574ce0_0.tar.bz2#4d8fd67e5ab7e00fde8ad085464f43b7
-https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h48d8840_2.tar.bz2#eba672c69baf366fdedd1c6f702dbb81
https://conda.anaconda.org/conda-forge/linux-64/docutils-0.16-py38h578d9bd_3.tar.bz2#a7866449fb9e5e4008a02df276549d34
https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.1-mpi_mpich_h9c45103_3.tar.bz2#4f1a733e563d27b98010b62888e149c9
https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.3.2-py38h1fd1430_1.tar.bz2#085365abfe53d5d13bb68b1dda0b439e
https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h6ad9fb6_0.tar.bz2#45142dc44fcd04934f9ad68ce205e54d
https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.0.1-py38h497a2fe_1.tar.bz2#1ef7b5f4826ca48a15e2cd98a5c3436d
https://conda.anaconda.org/conda-forge/linux-64/mpi4py-3.1.3-py38he865349_0.tar.bz2#b1b3d6847a68251a1465206ab466b475
-https://conda.anaconda.org/conda-forge/linux-64/numpy-1.21.4-py38he2449b9_0.tar.bz2#937a6c3d23aaf60f500514a3ea5709cb
+https://conda.anaconda.org/conda-forge/linux-64/numpy-1.21.5-py38h87f13fb_0.tar.bz2#07fef7a6a3c56e0410d047c0aa62416e
https://conda.anaconda.org/conda-forge/noarch/packaging-21.3-pyhd8ed1ab_0.tar.bz2#71f1ab2de48613876becddd496371c85
https://conda.anaconda.org/conda-forge/noarch/partd-1.2.0-pyhd8ed1ab_0.tar.bz2#0c32f563d7f22e3a34c95cad8cc95651
https://conda.anaconda.org/conda-forge/linux-64/pillow-6.2.1-py38hd70f55b_1.tar.bz2#80d719bee2b77a106b199150c0829107
@@ -168,55 +166,55 @@ https://conda.anaconda.org/conda-forge/linux-64/pysocks-1.7.1-py38h578d9bd_4.tar
https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984
https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-2.0.2-py38h497a2fe_1.tar.bz2#977d03222271270ea8fe35388bf13752
https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h497a2fe_3.tar.bz2#131de7d638aa59fb8afbce59f1a8aa98
-https://conda.anaconda.org/conda-forge/linux-64/setuptools-59.4.0-py38h578d9bd_0.tar.bz2#e8312f6bb6da4bb59dc5bb877636859b
+https://conda.anaconda.org/conda-forge/linux-64/qt-5.12.9-hda022c4_4.tar.bz2#afebab1f5049d66baaaec67d9ce893f0
+https://conda.anaconda.org/conda-forge/linux-64/setuptools-60.2.0-py38h578d9bd_0.tar.bz2#cbaabcbc6fb460f1a515188e6d966fa2
https://conda.anaconda.org/conda-forge/linux-64/tornado-6.1-py38h497a2fe_2.tar.bz2#63b3b55c98b4239134e0be080f448944
-https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-13.0.0.post2-py38h497a2fe_4.tar.bz2#b70ba4bc5f580bde28e160cfb5b214f2
+https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-14.0.0-py38h497a2fe_0.tar.bz2#8da7787169411910df2a62dc8ef533e0
https://conda.anaconda.org/conda-forge/linux-64/virtualenv-20.4.7-py38h578d9bd_1.tar.bz2#37717ce393db8536ae2b613839af4274
https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h497a2fe_1003.tar.bz2#9189b42c42b9c87b2b2068cbe31901a8
https://conda.anaconda.org/conda-forge/linux-64/cftime-1.5.1.1-py38h6c62de6_1.tar.bz2#d4a47fd2bbc8292a322d462734b0ada5
-https://conda.anaconda.org/conda-forge/linux-64/cryptography-36.0.0-py38h3e25421_0.tar.bz2#c6e700a66fcdb217dafbc16276e08421
+https://conda.anaconda.org/conda-forge/linux-64/cryptography-36.0.1-py38h3e25421_0.tar.bz2#acc14d0d71dbf74f6a15f2456951b6cf
https://conda.anaconda.org/conda-forge/noarch/dask-core-2021.12.0-pyhd8ed1ab_0.tar.bz2#e572bf40b1e8783fed2526ecb5f5209e
https://conda.anaconda.org/conda-forge/linux-64/editdistance-s-1.0.0-py38h1fd1430_2.tar.bz2#482431310c7b3320a31c8c6ce82a7a15
-https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.28.3-py38h497a2fe_0.tar.bz2#f2e845a2fa4c50060aca0a168e82e93d
+https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.28.5-py38h497a2fe_0.tar.bz2#f611d0be8205d5b0566f9c97e7d66ae3
https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-2.9.1-h83ec7ef_1.tar.bz2#9a9e823b2e31e84e5ce06f54ffce9d70
https://conda.anaconda.org/conda-forge/noarch/jinja2-3.0.3-pyhd8ed1ab_0.tar.bz2#036d872c653780cb26e797e2e2f61b4c
https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-mpi_mpich_h319fa22_1.tar.bz2#7583fbaea3648f692c0c019254bc196c
https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h6c62de6_1006.tar.bz2#829b1209dfadd431a11048d6eeaf5bef
https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.6.0-pyhd8ed1ab_0.tar.bz2#0941325bf48969e2b3b19d0951740950
-https://conda.anaconda.org/conda-forge/linux-64/pandas-1.3.4-py38h43a58ef_1.tar.bz2#fd33f08f30169c73c7611cb43d1297c7
+https://conda.anaconda.org/conda-forge/linux-64/pandas-1.3.5-py38h43a58ef_0.tar.bz2#171cc96da3b1a0ebd4bf2b5586b7cda3
https://conda.anaconda.org/conda-forge/noarch/pip-21.3.1-pyhd8ed1ab_0.tar.bz2#e4fe2a9af78ff11f1aced7e62128c6a8
-https://conda.anaconda.org/conda-forge/noarch/pygments-2.10.0-pyhd8ed1ab_0.tar.bz2#32bcce837f1316f1c3208118b6c5e5fc
+https://conda.anaconda.org/conda-forge/noarch/pygments-2.11.1-pyhd8ed1ab_0.tar.bz2#6f857f10fe2960dce20d59d71a290d51
https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.3.0-py38hdd21e9b_0.tar.bz2#ceb8ec641cd5faa40b568f8ca008b6dc
+https://conda.anaconda.org/conda-forge/linux-64/pyqt-impl-5.12.3-py38h0ffb2e6_8.tar.bz2#acfc7625a212c27f7decdca86fdb2aba
https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.2.post0-py38h6c62de6_1.tar.bz2#a350e3f4ca899e95122f66806e048858
https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.2.0-py38h6c62de6_1.tar.bz2#2953d3fc0113fc6ffb955a5b72811fb0
-https://conda.anaconda.org/conda-forge/linux-64/qt-5.12.9-hda022c4_4.tar.bz2#afebab1f5049d66baaaec67d9ce893f0
https://conda.anaconda.org/conda-forge/linux-64/scipy-1.7.3-py38h56a6a73_0.tar.bz2#2d318049369bb52d2687b0ac2be82751
https://conda.anaconda.org/conda-forge/linux-64/shapely-1.8.0-py38h800f7b8_4.tar.bz2#5fb9a3af4ebd8b21ca099e107306be72
https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-napoleon-0.7-py_0.tar.bz2#0bc25ff6f2e34af63ded59692df5f749
-https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.0.1-py38h6c62de6_1.tar.bz2#d4a7103f9e1681bf2f27a3de4f9ad243
+https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.0.1-py38h6c62de6_2.tar.bz2#350322b046c129e5802b79358a1343f7
https://conda.anaconda.org/conda-forge/noarch/identify-2.3.7-pyhd8ed1ab_0.tar.bz2#ae1a5e834fbca62ee88ab55fb276be63
https://conda.anaconda.org/conda-forge/noarch/imagehash-4.2.1-pyhd8ed1ab_0.tar.bz2#01cc8698b6e1a124dc4f585516c27643
-https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.5.0-py38hf4fb855_0.tar.bz2#bd5227acb2293fbb5227028860b4b482
+https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.5.1-py38hf4fb855_0.tar.bz2#47cf0cab2ae368e1062e75cfbc4277af
https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.5.3-mpi_mpich_h1364a43_6.tar.bz2#9caa0cf923af3d037897c6d7f8ea57c0
https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.5.8-nompi_py38h2823cc8_101.tar.bz2#1dfe1cdee4532c72f893955259eb3de9
https://conda.anaconda.org/conda-forge/linux-64/pango-1.48.10-hb8ff022_1.tar.bz2#f67c24bfd760cd50c285556ee7507853
https://conda.anaconda.org/conda-forge/noarch/pyopenssl-21.0.0-pyhd8ed1ab_0.tar.bz2#8c49efecb7dca466e18b06015e8c88ce
-https://conda.anaconda.org/conda-forge/linux-64/pyqt-impl-5.12.3-py38h0ffb2e6_8.tar.bz2#acfc7625a212c27f7decdca86fdb2aba
+https://conda.anaconda.org/conda-forge/linux-64/pyqtchart-5.12-py38h7400c14_8.tar.bz2#78a2a6cb4ef31f997c1bee8223a9e579
+https://conda.anaconda.org/conda-forge/linux-64/pyqtwebengine-5.12.1-py38h7400c14_8.tar.bz2#857894ea9c5e53c962c3a0932efa71ea
https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.20.1-py38h2f98cf7_5.tar.bz2#8f989133575134016a0def90ae965e85
https://conda.anaconda.org/conda-forge/linux-64/esmf-8.2.0-mpi_mpich_h4975321_100.tar.bz2#56f5c650937b1667ad0a557a0dff3bc4
https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h539f30e_1.tar.bz2#606777b4da3664d5c9415f5f165349fd
-https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.52.4-hc3c00ef_0.tar.bz2#310ae1e113d6febc26fe3b44e3519757
+https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.52.5-hc3c00ef_0.tar.bz2#43694e152ee85559ddf64b1acb8801dd
https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.0-pyhd8ed1ab_0.tar.bz2#9113b4e4fa2fa4a7f129c71a6f319475
https://conda.anaconda.org/conda-forge/linux-64/pre-commit-2.16.0-py38h578d9bd_0.tar.bz2#61e1e83f0eccef5e449db03c340ab6c2
-https://conda.anaconda.org/conda-forge/linux-64/pyqtchart-5.12-py38h7400c14_8.tar.bz2#78a2a6cb4ef31f997c1bee8223a9e579
-https://conda.anaconda.org/conda-forge/linux-64/pyqtwebengine-5.12.1-py38h7400c14_8.tar.bz2#857894ea9c5e53c962c3a0932efa71ea
+https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.12.3-py38h578d9bd_8.tar.bz2#88368a5889f31dff922a2d57bbfc3f5b
https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.7-pyhd8ed1ab_0.tar.bz2#be75bab4820a56f77ba1a3fc9139c36a
https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.2.0-mpi_mpich_py38h9147699_101.tar.bz2#5a9de1dec507b6614150a77d1aabf257
https://conda.anaconda.org/conda-forge/linux-64/graphviz-2.50.0-h85b4f2f_1.tar.bz2#bc6418fd87ea67cf14417337ced3daa2
-https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.12.3-py38h578d9bd_8.tar.bz2#88368a5889f31dff922a2d57bbfc3f5b
+https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.5.1-py38h578d9bd_0.tar.bz2#0d78be9cf1c400ba8e3077cf060492f1
https://conda.anaconda.org/conda-forge/noarch/requests-2.26.0-pyhd8ed1ab_1.tar.bz2#358581cc782802270d77c454c73a811a
-https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.5.0-py38h578d9bd_0.tar.bz2#6ab6a5b2e54598428ca8ba112d4b682e
-https://conda.anaconda.org/conda-forge/noarch/sphinx-4.3.1-pyh6c4a22f_0.tar.bz2#74d14a40bf09d1d8d788a8433f04e0d8
+https://conda.anaconda.org/conda-forge/noarch/sphinx-4.3.2-pyh6c4a22f_0.tar.bz2#e8ffaea0961c0d7a6767f2394042043d
https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.4.0-pyhd8ed1ab_0.tar.bz2#80fd2cc25ad45911b4e42d5b91593e2f
https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.10.1-pyhd8ed1ab_0.tar.bz2#4918585fe5e5341740f7e63c61743efb
https://conda.anaconda.org/conda-forge/noarch/sphinx-panels-0.6.0-pyhd8ed1ab_0.tar.bz2#6eec6480601f5d15babf9c3b3987f34a