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